Angular.js: Détection de UNINITIALIZED_VALUE dans le hook de cycle de vie $onChanges

Créé le 15 juil. 2016  ·  5Commentaires  ·  Source: angular/angular.js

Avec un observateur de portée, vous pouvez détecter si c'est la première fois que l'observateur s'exécute en vérifiant si les nouvelles et anciennes valeurs sont les mêmes :

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

Cependant, avec le hook de cycle $onChanges vie

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

mais cela semble être un peu un hack.

La meilleure solution à laquelle je puisse penser est que l'objet UNINITIALIZED_VALUE doit être stocké en tant que constante (lecture seule) quelque part (par exemple angular.UNINITIALIZED_VALUE ) à comparer, bien qu'il existe probablement d'autres solutions également.

Merci!!

works as expected

Commentaire le plus utile

Chaque objet change (contenu dans l'objet changes ) a une méthode isFirstChange() à cet effet précis.

Tous les 5 commentaires

Chaque objet change (contenu dans l'objet changes ) a une méthode isFirstChange() à cet effet précis.

J'ai utilisé le code suivant car isFirstChange() n'est pas disponible dans l'objet changes :

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

@saurajit il ne semble pas qu'il soit là (par exemple, dans la console des outils de développement, il semble manquer lors du survol de l'objet change.expr) mais cette fonction est cachée sur le prototype de l'objet. Essayez d'exécuter changes.expr.isFirstChange() (ou dans votre exemple changesObj.fieldInfo.isFirstChange() ).

J'ai utilisé le code suivant car isFirstChange() n'est pas disponible dans l'objet changes :

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

Désolé mais cela ne fonctionnera pas avec un bundle minifié.

Comme mentionné dans https://github.com/angular/angular.js/issues/14917#issuecomment -232971141, la méthode isFirstChange() est sur chaque _ objet _ à l'intérieur de changes . Donc, dans ce cas, il devrait être changesObj.fieldInfo.isFirstChange() .

Cette page vous a été utile?
0 / 5 - 0 notes