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!!
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()
.
Commentaire le plus utile
Chaque objet
change
(contenu dans l'objetchanges
) a une méthodeisFirstChange()
à cet effet précis.