範囲でNGModelControllerを使用することが可能であるかどうかを混同しました
-
21-12-2019 - |
質問
NGModelControllerの使用については非常に混乱しています。たとえば、ディレクティブからのコントローラは、このようにすることができます。
myModule.directive('amValidateName', ['validate', function (validate) {
return {
restrict: 'A',
scope: {
errorName: '='
},
require: 'ngModel',
link: function (scope, elm, attrs, ngModelCtrl) {
}
}
}]);
.
しかし、この
のようにNG-ControllerでNGModelCtrlを使用することができます。myModule.controller('SignUpCtrl', ['$scope', 'validate', function ($scope, validate) {
//Can i use ngModelController here, methods like $setPristine()?
}]);
.
私はAngular Documentation
でこの文を見つけましたSuch DOM related logic should be provided by other directives which make use of NgModelController for data-binding.
.
それは、最初の例のように他の指令にのみ必要とされているようなShuoldを意味します。
解決
$範囲で公開されているフォームコントローラを介して各モデルコントローラと対話することができます。 NGModelのリンク段階では、それがその親フォームディレクティブに登録されている場合、フォームのコントローラは$ scopeに公開されます。これにより、フォームとフォーム上の任意のモデルと対話するための$ SCOPEの単一のポイントがあります。ユーザーが新しいルートに移動しようとしたときにフォームが汚れているかどうかを確認する簡単な例:
app.controller('myController', ['$scope', '$window', function ($scope, $window) {
$scope.$on('$locationChangeStart', function (event) {
if ($scope.myForm.$dirty) {
if (!$window.confirm('You have unsaved changes. Do you want to discard all changes?')) {
event.preventDefault();
}
}
});
}]);
.
コントローラ内のこれらの種類のロジックまたは別のディレクティブを実行している場合は、議論できます。上記の例は簡単ですが、サーバーが受信したエラーの検証状態の設定のようなものを実行したい場合は、サーバーに投稿してから、これを必ず適用しないでください。コントローラ
更新:下記の@ charlietffコメントに従って、フォームにname
が必要で、その名前がscope変数フォームオブジェクトになり、e.g:
<form name="myForm">
</form>
. 所属していません StackOverflow