Ich habe eine Webseite, die als Editor für eine einzelne Entität dient und als tiefes Diagramm in der Eigenschaft $ scope.fieldcontainer gespeichert ist. Nachdem ich eine Antwort von meiner REST-API erhalten habe (über $ resource), füge ich 'fieldcontainer' eine Überwachung hinzu. Ich benutze diese Uhr, um festzustellen, ob die Seite / Entität "schmutzig" ist. Im Moment lasse ich die Schaltfläche "Speichern" springen, aber ich möchte die Schaltfläche "Speichern" wirklich unsichtbar machen, bis der Benutzer das Modell verschmutzt.
Was ich bekomme, ist ein einzelner Auslöser der Uhr, der meiner Meinung nach geschieht, weil die Zuweisung von .fieldcontainer = ... unmittelbar nach dem Erstellen meiner Uhr erfolgt. Ich habe darüber nachgedacht, nur eine "dirtyCount" -Eigenschaft zu verwenden, um den anfänglichen Fehlalarm zu absorbieren, aber das fühlt sich sehr hackig an ... und ich dachte, es muss eine "Angular Idiomatic" -Methode geben, um damit umzugehen - ich bin nicht der einzige Verwenden einer Uhr, um ein schmutziges Modell zu erkennen.
Hier ist der Code, mit dem ich meine Uhr eingestellt habe:
$scope.fieldcontainer = Message.get({id: $scope.entityId },
function(message,headers) {
$scope.$watch('fieldcontainer',
function() {
console.log("model is dirty.");
if ($scope.visibility.saveButton) {
$('#saveMessageButtonRow').effect("bounce", { times:5, direction: 'right' }, 300);
}
}, true);
});
Ich denke immer nur, dass es einen saubereren Weg geben muss, als meinen "UI Dirtyying" -Code mit einem "if (dirtyCount> 0)" zu schützen ...
quelle
undefined
. Es hat einen Standardwert, der für den Fall erforderlich ist, dass bei meinem Modellupdate nicht alle Informationen angezeigt werden. Einige Werte ändern sich also nicht, sondern müssen ausgelöst werden.Antworten:
Setzen Sie kurz vor dem ersten Laden ein Flag.
und dann, wenn die erste $ watch feuert, tun Sie es
Das Flag wird erst am Ende des aktuellen Digest-Zyklus abgerissen, sodass die nächste Änderung nicht blockiert wird.
quelle
Beim ersten Aufruf des Listeners sind der alte und der neue Wert identisch. Also mach einfach das:
Dies ist eigentlich die Art und Weise, wie die Angular-Dokumente empfehlen, damit umzugehen :
quelle
null
ursprünglich geladenen Wert zu ignorieren, die Änderung nicht zu ignorieren, wenn keine Änderung vorliegt.null
.oldValue
wird beim ersten Start null sein.Mir ist klar, dass diese Frage beantwortet wurde, aber ich habe einen Vorschlag:
Die Verwendung von Flags funktioniert, hat aber einen gewissen Code-Geruch , finden Sie nicht?
quelle
return unless oldValue?
(? Ist der existenzielle Operator in CS).Beim erstmaligen Laden der aktuellen Werte ist das alte Wertefeld undefiniert. Das folgende Beispiel hilft Ihnen also, anfängliche Ladungen auszuschließen.
quelle
null
undundefined
in dieser Situation übereinstimmen werden, oder ('1' == 1
etc)Validieren Sie einfach den Status des neuen Werts:
quelle