web-dev-qa-db-ja.com

Angular-ng-modelが変更されたときにng-changeが起動しない

入力は次のとおりです。

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

action()は、入力を手動で入力して変更すると実行されます。しかし、プログラムで他の関数によってrepair.testの値を変更した場合、ng-changeのアクションは起動しません。 angularチュートリアルを読んだことがありますが、これはおそらく予想される動作です。

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

「値の変更がモデルから生じている場合、式は評価されません。」 <-これも必要です。モデルが何らかの方法で変更されたときに、コントローラーでアクションを起動するにはどうすればよいですか? (入力または他の関数による入力)

助けてくれてありがとう。

編集:

モデルの値は実際には_form.$valid_であり、その周りに独自のフォームコントローラーがあります(私は思う)。そのため、アクション関数を使用して親コントローラーに値を渡そうとしました。そのため、現時点では_$scope.$watch_は機能しません。初期化されている場合のみです。

18
tomazahlin

ngChange は入力用です。モデルをこのように聞きたい場合

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

            });
25
ThomasP1988

ngChange 式は、入力値の変更により新しい値がモデルにコミットされる場合にのみ評価されます。

評価されますnot評価されません:

  • _$parsers_変換パイプラインから返された値が変更されていない場合
  • モデルがnullのままであるため、入力が引き続き無効である場合
  • 入力値の変更ではなく、プログラムによってモデルが変更された場合

$ scope。$ watch -$watch(watchExpression, listener, [objectEquality]);を使用してウォッチャーを作成してみてください。

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

コントローラーでウォッチャー機能を使用できます

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

別の解決策は、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)"/>
0