Предупреждение: Это просто идея, которая работает в тривиальный пример. Я не говорю, что это неправильно (это открыто для обсуждения, хотя), но я НЕ использовал его в более сложном контексте.
Итак, вы можете создать вторую директиву 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>
Только вторая форма помечено с 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
}
}
};
});
Посмотри live и проверить журналы. Оригинальная директива input
живет бок о бок с вашим собственным. Доказательством этого является то, что форма все еще работает (по мере ввода, модель обновляется: это input
, а затем, ngModel
).
Вашей input
директивы может также использовать ngModel манипулировать значение ввода:
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
}
}
};
});
Я до сих пор содрогнуться, когда речь идет об использовании JQuery материала для углового приложения. Тем не менее, я бы попробовал, спасибо за то, что указали на очевидный – user2422960
, вам нужно перебирать дерево до