警告: これは、些細な例で機能するアイデアにすぎません。私はそれが間違っていると言っているわけではありません (ただし、これは議論の余地があります) が、より複雑なコンテキストで使用したことはありません。
したがって...実際に 2 番目のinput
ディレクティブを作成し、別のディレクティブ (たとえばmyDirective
) が外側のフォームに適用された場合にのみ適用することができます。
2 つのフォームがあるとします。
<body>
<form name="myForm1" ng-controller="MainCtrl">
Name: <input id="name1" type="text" ng-model="data.name" /><br/>
Surname: <input id="surname1" type="text" ng-model="data.surname" />
<pre>{{data}}</pre>
</form>
<br/>
<form name="myForm2" ng-controller="MainCtrl" my-directive>
Name: <input id="name2" type="text" ng-model="data.name" /><br/>
Surname: <input id="surname2" type="text" ng-model="data.surname" />
<pre>{{data}}</pre>
</form>
</body>
でタグ付けされているのは 2 番目のフォームだけmy-directive
です。これで、ディレクティブは次のようになります。
app.directive("myDirective", function(){
return {
restrict: 'A',
require: ['form'],
controller: function() {
// nothing here
},
link: function(scope, ele, attrs, controllers){
var formCtrl = controllers[0];
console.log("myDirective applied to form:", formCtrl.$name);
}
};
});
app.directive("input", function(){
return {
restrict: 'E',
priority: -1000,
require: '^?myDirective',
link: function(scope, ele, attrs, ctrl){
if (ctrl) {
console.log("applying custom behaviour to input: ", ele.attr('id'));
// ... awesomeness here
}
}
};
});
ライブを見て、ログをチェックしてください。元のinput
ディレクティブは、独自のディレクティブと共存します。その証拠は、フォームが引き続き機能することです (入力すると、モデルが更新されます。それがの仕事input
であり、次にngModel
の仕事です)。
ディレクティブは、 ngModelinput
を使用して入力値を操作することもできます。
app.directive("input", function(){
return {
restrict: 'E',
priority: -1000,
require: ['?ngModel', '^?myDirective'],
link: function(scope, ele, attrs, ctrls){
var ngModel = ctrls[0];
var myDirective = ctrls[1];
if (myDirective) {
console.log("applying custom behaviour to input: ", ele.attr('id'));
// ... awesomeness here
}
}
};
});