javascript - example - Angular: ng-change no se dispara cuando se cambia ng-model
ng model dynamic name angular 4 (4)
La expresión https://docs.angularjs.org/api/ng/directive/ngChange solo se evalúa cuando un cambio en el valor de entrada hace que se https://docs.angularjs.org/api/ng/directive/ngChange un nuevo valor en el modelo.
No será evaluado:
- si el valor devuelto por la tubería de transformación
$parsers
no ha cambiado - Si la entrada sigue siendo inválida ya que el modelo permanecerá nulo.
- Si el modelo se cambia mediante programación y no por un cambio en el valor de entrada
Intente crear un observador utilizando $scope.$watch $watch(watchExpression, listener, [objectEquality]);
- $watch(watchExpression, listener, [objectEquality]);
Ejemplo
$scope.$watch(''repair.test'', function(newValue, oldValue) {
// ...
});
La entrada es la siguiente:
<input type="text" ng-model="repair.test" ng-change="action()" />
La action()
se ejecuta cuando escribo manualmente y cambio la entrada. Sin embargo, si cambio el valor de repair.test por alguna otra función mediante programación, no se activará la acción de ng-change. He leído el tutorial angular y probablemente sea el comportamiento esperado.
https://docs.angularjs.org/api/ng/directive/ngChange
"La expresión no se evalúa cuando el cambio de valor proviene del modelo". <- Necesito esto también. ¿Cómo puedo disparar una acción en el controlador, cuando el modelo cambia de alguna manera? (escribiendo en entrada o por cualquier otra función)
Gracias por la ayuda.
Editar:
El valor del modelo es en realidad el form.$valid
, que tiene su propio controlador de Formulario a su alrededor (creo), es por eso que utilicé la función de acción para intentar pasar el valor al controlador principal. Así que $scope.$watch
en este momento no funciona, solo cuando se inicializa.
Otra solución sería usar una directiva que vigilara el modelo en busca de cambios en lugar de usar ng-change
.
app.directive(''onModelChange'', function($parse){
return {
restrict: "A",
require: "?ngModel",
link: function(scope, elem, attrs, ctrl) {
scope.$watch(attrs[''ngModel''], function (newValue, oldValue) {
if (typeof(newValue) === "undefined" || newValue == oldValue) {
return;
}
var changeExpr = $parse(attrs[''onModelChange'']);
if (changeExpr) {
changeExpr(scope);
}
});
}
};
});
Entonces lo usarías así:
<input class="value" type="text" ng-model="myVar" on-model-change="doSomething(myVar)"/>
Puedes usar una función de observador en tu controlador
$scope.$watch(''repair.test'', function() {
$scope.action();
});
https://docs.angularjs.org/api/ng/directive/ngChange es solo para la entrada, si quieres escuchar al modelo, hazlo así
$scope.$watch(''repair.test'', function(newvalue,oldvalue) {
});