私はまだ AngularJS にかなり慣れていないので、$scope のタイミングを理解するのに苦労していると思います。コントローラーでは、さまざまなフォーム要素にバインドされたモデル データのウォッチャーをセットアップしました。ウォッチャーは、フォームが無効な場合を除き、データが変更されると ajax リクエストを送信します。myForm.$valid でフォームの有効性をチェックしています。ただし、モデル データがフォームではなくコントローラーで更新される場合を除いて、これはすべて非常に簡単です。検証は期待どおりに実行されますが、form.$valid には、更新されたデータの値ではなく、以前の値が残っています。たとえば、フォームが以前に有効だった場合、必要な入力にバインドされたモデル値を削除すると、モデル データが変更されたためにウォッチャーが起動しますが、myForm.$valid の値をログに記録すると、その値はまだ true です。
だから私の質問は、A.なぜこれが起こっているのですか?、しかしもっと重要なことは、B.私が達成しようとしていることを処理する正しい方法は何ですか? カスタム ディレクティブは理にかなっていますか?
簡単な例を次に示します。
HTML:
<div ng-controller="MyCtrl">
<form name="myForm">
<input type="text" name="myField" ng-model="myData" required>
<button type="button" ng-click="myData=''">Delete</button>
</form>
<div>
The watcher says the form is: <strong>{{ formStatus }}</strong>
</div>
</div>
コントローラ:
myApp.controller('MyCtrl', ['$scope', function($scope) {
$scope.myData = 'abc';
$scope.formStatus = '';
$scope.$watch('myData', function(newVal, oldVal) {
if (newVal != oldVal) {
console.log("my data changed");
console.log("my form valid = ", $scope.myForm.$valid);
$scope.formStatus = $scope.myForm.$valid ? 'Valid' : 'Invalid';
}
});
}]);