输入如下:
<input type="text" ng-model="repair.test" ng-change="action()" />
手动输入和更改输入时执行action()
。但是,如果我通过编程方式通过其他函数更改repair.test值,则不会触发ng-change的操作。我已阅读角度教程,它可能是预期的行为。
https://docs.angularjs.org/api/ng/directive/ngChange
&#34;当值变化来自模型时,不评估表达式。&#34; &lt; - 我也需要这个。 当模型以任何方式改变时,如何在控制器中触发动作? (输入输入或任何其他功能)
感谢您的帮助。
编辑:
模型值实际上是form.$valid
,它有自己的Form控制器(我认为),这就是我使用action函数尝试将值传递给父控制器的原因。因此$scope.$watch
目前只有在初始化时才起作用。
答案 0 :(得分:25)
ngChange仅用于输入,如果你想听模型这样做
$scope.$watch('repair.test', function(newvalue,oldvalue) {
});
答案 1 :(得分:6)
ngChange表达式仅在输入值的更改导致将新值提交给模型时进行评估。
将不进行评估:
$parsers
转换管道返回的值有
没有改变尝试使用$scope.$watch - $watch(watchExpression, listener, [objectEquality]);
示例
$scope.$watch('repair.test', function(newValue, oldValue) {
// ...
});
答案 2 :(得分:3)
您可以在控制器中使用观察者功能
$scope.$watch('repair.test', function() {
$scope.action();
});
答案 3 :(得分:0)
另一种解决方案是使用指令来监视模型的任何更改,而不是使用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);
}
});
}
};
});
然后您将按如下方式使用它:
<input class="value" type="text" ng-model="myVar" on-model-change="doSomething(myVar)"/>