モデルがプログラムで変更されたときにangularのng-changeが呼び出されると、問題が発生します。
$scope.sendMessage = function() {
$scope.message = "Message sent";
}
$scope.confirmed = true;
$scope.mySelectBox = $scope.selects[1];
<select ng-model="mySelectBox"
ng-options="item.name for item in selects track by item.name"
ng-change="sendMessage()">
</select>
コード例は次のとおりです。 http://plnkr.co/edit/R4MO86ihMrauHXhpCMxi?p=preview
sendMessage
は呼び出されるべきではないため、メッセージはnullである必要があります。モデルはプログラムで変更されます。
ドキュメントによると、あなたは正しいです。
https://docs.angularjs.org/api/ng/directive/ngChange
しかし、これはイベントがフックされる順序によって引き起こされたバグのようです
それを回避する最良の方法-jsハンドラー(onchange)に頼ること
$scope.$watch("mySelectBox", function(a,b) {
if (a.name!=b.name) {
$scope.message = "Message sent! (old="+b.name+', new='+a.name+')';
}
});
Plunkを参照してください http://plnkr.co/edit/2ZbxS1tszppR9SrNqxVB?p=preview
HTH
ngModelOptions で試すことができます。参考のためにこのプランカーを参照してください http://plnkr.co/edit/BdKx62RW5Ls2Iz1H3VR1?p=preview 。
私の例では、ng-model-options="{ updateOn: 'change', debounce: { change: 0 } }"
を使用しましたが、機能しているようです。選択を変更すると、ngChangeで提供される関数のみが実行されます。初期化フェーズでは、message
は空のままです。
Ng-changeコールバックは、モデルが変更されるたびに変更され、初期設定をそのような変更として扱います。あなたがしたいと思うかもしれないことは、目的のコードを実行することですユーザーがそれと対話した後でのみ。フィールドの$ touchedプロパティを確認できます。
<form name="exampleForm" ng-controller="ExampleController">
<select ng-model="mySelectBox" name="mySelectBox"
ng-options="item.name for item in selects track by item.name"
ng-change="sendMessage()">
</select>
<p>message = {{message}}</p>
</form>
$scope.sendMessage = function() {
if ($scope.exampleForm.mySelectBox.$touched) {
$scope.message = "Message sent";
}
}
コントローラでモデルに値を提供しているので、リストと一致するモデルの値を設定すると、ng-changeが呼び出されます。
更新されたプランカーを参照してください: http://plnkr.co/edit/f3xGmKesLFbzti56WLyH?p=preview