How do I create a directive that adds other directives to an element?
For example, I want:
<input tag/>
to be linked as:
<input ng-pattern='/[\\w\\d]+/' ng-maxlength='10'/>
I don't think $compile()
, a link function, or terminal
are necessary. Angular will automatically compile the telement
for us.
.directive('tag', [function() {
return {
priority: 1000,
compile: function(telement, attrs) {
attrs.$set('tag', null);
attrs.$set('ngMaxlength', '10');
attrs.$set('ngPattern', '/[\\w\\d]+/');
}
};
}]);
Tested with this HTML:
<input ng-model="test" ng-init="test=2" tag>
{{test}}
Plunker.
I came up with a solution that seems to work:
.directive('tag', ['$compile', function($compile) {
return {
priority: 1000,
terminal: true,
compile: function(telement, attrs) {
attrs.$set('tag', null);
attrs.$set('ngMaxlength', '10');
attrs.$set('ngPattern', '/[\\w\\d]+/');
var link = $compile(telement);
return function($scope, $element) {
link($scope, function(clonedElement) {
$element.replaceWith(clonedElement);
});
}
}
}
}]);
The key is making sure that the directive has a higher priority than all the other directives on the element and terminating, so that other directives arent compiled and linked.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With