Angular.js: Detectando UNINITIALIZED_VALUE en el gancho del ciclo de vida de $ onChanges

Creado en 15 jul. 2016  ·  5Comentarios  ·  Fuente: angular/angular.js

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!!

works as expected

Comentario más útil

Cada objeto change (contenido en el objeto changes ) tiene un método isFirstChange() para este propósito exacto.

Todos 5 comentarios

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() .

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

jetta20162 picture jetta20162  ·  3Comentarios

guyandtheworld picture guyandtheworld  ·  3Comentarios

brijesh1ec picture brijesh1ec  ·  3Comentarios

ceymard picture ceymard  ·  3Comentarios

tdumitrescu picture tdumitrescu  ·  3Comentarios