Con un observador de alcance, puede detectar si es la primera vez que el observador se está ejecutando al verificar si los valores nuevos y antiguos son los mismos:
$scope.$watch('expr', function (newValue, oldValue) {
if (newValue === oldValue) {
// first time running
}
});
Sin embargo, con el gancho del ciclo $onChanges
vida Angular 1.5
ExampleController.prototype.$onChanges = function (changes) {
if (changes.expr.previousValue.constructor.name === 'UNINITIALIZED_VALUE') {
// first time running
}
};
pero eso parece un truco.
La mejor solución en la que puedo pensar es tener el objeto UNINITIALIZED_VALUE debe almacenarse como una constante (solo lectura) en algún lugar (por ejemplo, angular.UNINITIALIZED_VALUE
) para comparar, aunque probablemente también haya otras soluciones.
¡¡Gracias!!
Cada objeto change
(contenido en el objeto changes
) tiene un método isFirstChange()
para este propósito exacto.
Usé el siguiente código ya que isFirstChange()
no está disponible en el objeto de cambios:
ctrl.$onChanges = function (changesObj) {
if (changesObj.fieldInfo.previousValue.constructor.name === 'UNINITIALIZED_VALUE') {
init();
}
};
@saurajit , no parece que esté allí (por ejemplo, en la consola de herramientas de desarrollo, parece que falta al pasar el cursor sobre el objeto change.expr) pero esa función está oculta en el prototipo del objeto. Intente ejecutar changes.expr.isFirstChange()
(o en su ejemplo changesObj.fieldInfo.isFirstChange()
).
Usé el siguiente código ya que
isFirstChange()
no está disponible en el objeto de cambios:
ctrl.$onChanges = function (changesObj) { if (changesObj.fieldInfo.previousValue.constructor.name === 'UNINITIALIZED_VALUE') { init(); } };
Lo siento, pero esto no funcionará con un paquete reducido.
Como se menciona en https://github.com/angular/angular.js/issues/14917#issuecomment -232971141, el método isFirstChange()
está en cada _ objeto _ dentro de changes
. Entonces, en este caso, debería ser changesObj.fieldInfo.isFirstChange()
.
Comentario más útil
Cada objeto
change
(contenido en el objetochanges
) tiene un métodoisFirstChange()
para este propósito exacto.