Angular.js: Erkennen von UNINITIALIZED_VALUE im $onChanges-Lebenszyklus-Hook

Erstellt am 15. Juli 2016  ·  5Kommentare  ·  Quelle: angular/angular.js

Mit einem Scope-Watcher können Sie erkennen, ob der Watcher zum ersten Mal ausgeführt wird, indem Sie prüfen, ob die neuen und alten Werte gleich sind:

$scope.$watch('expr', function (newValue, oldValue) {
    if (newValue === oldValue) {
        // first time running
    }
});

Beim Lebenszyklus-Hook Angular 1.5 $onChanges ist das Platzhalterobjekt UNINITIALIZED_VALUE jedoch der previousValue. Es gibt jedoch keine einfache Möglichkeit, dies zu überprüfen. Sie können dies tun, indem Sie den Namen des Konstruktors überprüfen:

ExampleController.prototype.$onChanges = function (changes) {
    if (changes.expr.previousValue.constructor.name === 'UNINITIALIZED_VALUE') {
        // first time running
    }
};

aber das scheint ein bisschen ein hack zu sein.

Die beste Lösung, die ich mir vorstellen kann, besteht darin, das UNINITIALIZED_VALUE-Objekt als Konstante (schreibgeschützt) irgendwo (zB angular.UNINITIALIZED_VALUE ) zum Vergleich zu speichern, obwohl es wahrscheinlich auch andere Lösungen gibt.

Vielen Dank!!

works as expected

Hilfreichster Kommentar

Jedes change Objekt (enthalten im changes Objekt) hat genau zu diesem Zweck eine isFirstChange() Methode.

Alle 5 Kommentare

Jedes change Objekt (enthalten im changes Objekt) hat genau zu diesem Zweck eine isFirstChange() Methode.

Ich habe den folgenden Code verwendet, da isFirstChange() im Änderungsobjekt nicht verfügbar ist:

ctrl.$onChanges = function (changesObj) { if (changesObj.fieldInfo.previousValue.constructor.name === 'UNINITIALIZED_VALUE') { init(); } };

@saurajit es sieht nicht so aus, als wäre es da (zB in der Dev-Tools-Konsole scheint es zu fehlen, wenn man auf das Objekt change.expr schwebt), aber diese Funktion ist im Prototyp des Objekts ausgeblendet. Versuchen Sie, changes.expr.isFirstChange() auszuführen (oder in Ihrem Beispiel changesObj.fieldInfo.isFirstChange() ).

Ich habe den folgenden Code verwendet, da isFirstChange() im Änderungsobjekt nicht verfügbar ist:

ctrl.$onChanges = function (changesObj) { if (changesObj.fieldInfo.previousValue.constructor.name === 'UNINITIALIZED_VALUE') { init(); } };

Tut mir leid, aber das funktioniert nicht mit einem minimierten Bundle.

Wie in https://github.com/angular/angular.js/issues/14917#issuecomment -232971141 erwähnt, befindet sich die Methode isFirstChange() für jedes _ Objekt _ innerhalb von changes . In diesem Fall sollte es also changesObj.fieldInfo.isFirstChange() .

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen