21

输入如下:

<input type="text" ng-model="repair.test"  ng-change="action()" />

action()我手动输入和更改输入时执行。但是,如果我以编程方式通过其他一些函数更改 repair.test 值,它不会触发 ng-change 的操作。我已经阅读了角度教程,这可能是预期的行为。

https://docs.angularjs.org/api/ng/directive/ngChange

“当值更改来自模型时,不会评估表达式。” <-我也需要这个。当模型以任何方式发生变化时,如何在控制器中触发动作?(输入输入或任何其他功能)

谢谢您的帮助。

编辑:

模型值实际上是form.$valid,它周围有自己的 Form 控制器(我认为),这就是我使用 action 函数尝试将值传递给父控制器的原因。所以$scope.$watch目前不起作用,只有在初始化时才起作用。

4

4 回答 4

28

ngChange仅用于输入,如果您想听模型,请这样做

$scope.$watch('repair.test', function(newvalue,oldvalue) {

            });
于 2014-07-17T11:50:12.093 回答
8

ngChange表达式仅在输入值的更改导致新值提交给模型时才被评估

不会被评估:

  • 如果从$parsers转换管道返回的值没有改变
  • 如果输入继续无效,因为模型将保持为空
  • 如果模型以编程方式更改而不是通过更改输入值

尝试使用$scope.$watch创建一个观察者-$watch(watchExpression, listener, [objectEquality]);

例子

$scope.$watch('repair.test', function(newValue, oldValue) {
    // ...
});
于 2016-09-12T13:55:18.217 回答
3

您可以在控制器中使用观察者功能

$scope.$watch('repair.test', function() {
    $scope.action();
});
于 2014-07-17T11:51:00.317 回答
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)"/>
于 2018-10-22T17:36:52.807 回答