Ich möchte nach Änderungen in einem Wörterbuch suchen, aber aus irgendeinem Grund wird der Rückruf nicht aufgerufen.
Hier ist ein Controller, den ich benutze:
function MyController($scope) {
$scope.form = {
name: 'my name',
surname: 'surname'
}
$scope.$watch('form', function(newVal, oldVal){
console.log('changed');
});
}
Hier ist Geige .
Ich erwarte, dass $ watch callback jedes Mal ausgelöst wird, wenn der Vor- oder Nachname geändert wird, aber das passiert nicht.
Was ist der richtige Weg, um es zu tun?
javascript
angularjs
angularjs-scope
Vladimir Sidorenko
quelle
quelle
Antworten:
Rufen Sie
$watch
mittrue
als drittes Argument:Wenn zwei komplexe Objekte in JavaScript verglichen werden, werden sie standardmäßig auf "Referenz" -Gleichheit überprüft, wobei gefragt wird, ob sich die beiden Objekte auf dasselbe beziehen, und nicht auf "Wert" -Gleichheit, bei der überprüft wird, ob die Werte aller Eigenschaften dieser Objekte vorliegen Objekte sind gleich.
Gemäß der Angular-Dokumentation gilt der dritte Parameter für
objectEquality
:quelle
true
, wird standardmäßig auf Referenzgleichheit geprüft, ob der überwachte Wert ein Objekt oder ein Array ist. In diesem Fall sollten Sie die Eigenschaften explizit angeben, wie$scope.$watch('form.name')
und$scope.$watch('form.surname')
Das
form
Objekt ändert sich nicht, nur diename
EigenschaftGeige aktualisiert
quelle
Kleiner Leistungstipp, wenn jemand einen Datenspeicherdienst mit Schlüssel -> Wertepaaren hat:
Wenn Sie einen Dienst namens dataStore haben , können Sie einen Zeitstempel aktualisieren, wenn sich Ihr Big-Data-Objekt ändert. Auf diese Weise beobachten Sie nicht das gesamte Objekt genau, sondern nur einen Zeitstempel für Änderungen.
Und in einer Direktive beobachten Sie nur, wie sich der Zeitstempel ändert
quelle
newVal
,oldVal
In diesem Beispiel sind die Zeitstempel - Werte nicht die beobachteten Objekte Werte. Diese Antwort wird dadurch nicht ungültig. Ich denke nur, dass dies ein erwähnenswerter Nachteil ist.Der Grund, warum Ihr Code nicht funktioniert, liegt darin, dass
$watch
standardmäßig die Referenzprüfung durchgeführt wird. Kurz gesagt, stellen Sie sicher, dass das Objekt, das an das Objekt übergeben wird, ein neues Objekt ist. In Ihrem Fall ändern Sie jedoch nur eine Eigenschaft des Formularobjekts und erstellen keine neue. Damit es funktioniert, können Sietrue
als dritten Parameter übergeben.Es wird funktionieren, aber Sie können $ watchCollection verwenden, was effizienter ist als $ watch, da
$watchCollection
auf flache Eigenschaften des Formularobjekts geachtet wird . Z.Bquelle
Wenn Sie nach Änderungen an Formularobjekten suchen, sollten Sie diese am besten beobachten
$watchCollection
. Bitte schauen Sie in die offizielle Dokumentation für verschiedene Leistungsmerkmale.quelle
Versuche dies:
quelle
Für alle, die nach einer Änderung an einem Objekt innerhalb einer Reihe von Objekten suchen möchten, schien dies für mich zu funktionieren (wie die anderen Lösungen auf dieser Seite nicht):
quelle
quelle