簡體   English   中英

Angular-ng-change在ng-model更改時不會觸發

[英]Angular - ng-change not firing when ng-model is changed

輸入如下:

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

ngChange僅用於輸入,如果你想聽模型這樣做

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

            });

僅當輸入值的更改導致將新值提交給模型時,才會評估ngChange表達式。

不會被評估:

  • 如果$parsers轉換管道返回的值沒有改變
  • 如果輸入繼續無效,因為模型將保持為空
  • 如果以編程方式更改模型,而不是更改輸入值

嘗試使用$ scope創建一個觀察者。$ watch - $watch(watchExpression, listener, [objectEquality]);

$scope.$watch('repair.test', function(newValue, oldValue) {
    // ...
});

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

$scope.$watch('repair.test', function() {
    $scope.action();
});

另一種解決方案是使用一個指令來監視模型的任何變化,而不是使用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)"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM