Angular-ng-change在ng-model更改时不会触发

时间:2014-07-17 11:45:23

标签: javascript angularjs data-binding angular-ngmodel angularjs-ng-change

输入如下:

<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目前只有在初始化时才起作用。

4 个答案:

答案 0 :(得分:25)

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

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

            });

答案 1 :(得分:6)

ngChange表达式仅在输入值的更改导致将新值提交给模型时进行评估。

进行评估:

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

尝试使用$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)"/>