入力は次のとおりです。
_<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
_は機能しません。初期化されている場合のみです。
ngChange は入力用です。モデルをこのように聞きたい場合
$scope.$watch('repair.test', function(newvalue,oldvalue) {
});
ngChange 式は、入力値の変更により新しい値がモデルにコミットされる場合にのみ評価されます。
評価されますnot評価されません:
$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)"/>