Dans le cas où vous avez plusieurs directives sur un seul élément du DOM et où l'
l'ordre dans lequel ils sont appliqués des questions, vous pouvez utiliser l' priority
de la propriété à l'ordre de leur
application. Les numéros les plus élevés exécuter en premier. La priorité par défaut est 0 si vous ne spécifiez pas un.
EDIT: après discussion, voici la complète solution de travail. La clé a été de supprimer l'attribut: element.removeAttr("common-things");
, et également element.removeAttr("data-common-things");
(dans le cas des utilisateurs de spécifier data-common-things
dans le code html)
angular.module('app')
.directive('commonThings', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true, //this setting is important, see explanation below
priority: 1000, //this setting is important, see explanation below
compile: function compile(element, attrs) {
element.attr('tooltip', '{{dt()}}');
element.attr('tooltip-placement', 'bottom');
element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop
element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html
return {
pre: function preLink(scope, iElement, iAttrs, controller) { },
post: function postLink(scope, iElement, iAttrs, controller) {
$compile(iElement)(scope);
}
};
}
};
});
Travail plunker est disponible à: http://plnkr.co/edit/Q13bUt?p=preview
Ou:
angular.module('app')
.directive('commonThings', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true,
priority: 1000,
link: function link(scope,element, attrs) {
element.attr('tooltip', '{{dt()}}');
element.attr('tooltip-placement', 'bottom');
element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop
element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html
$compile(element)(scope);
}
};
});
DÉMO
Explication des raisons pour lesquelles nous avons terminal: true
et priority: 1000
(un grand nombre):
Lorsque le DOM est prêt, angulaire marche dans les DOM pour identifier tous les inscrits de directives et de compiler les directives basée sur priority
si ces directives sont sur le même élément. Nous avons mis notre coutume de la directive en priorité à un nombre élevé afin de s'assurer qu'il sera compilé en premier et avec terminal: true
, les autres directives seront ignorés après cette directive est compilé.
Lors de notre coutume directive est compilé, il va modifier l'élément par l'ajout de directives et de suppression de lui-même et d'utiliser $compiler service pour compiler toutes les directives (y compris ceux qui ont été ignorés).
Si nous ne fixons pas les terminal:true
et priority: 1000
, il est possible que certaines directives sont compilés avant notre coutume directive. Et quand notre coutume directive utilise $compiler compiler l'élément => compiler à nouveau la déjà établi des directives. Cela va provoquer un comportement imprévisible, surtout si les directives compilé avant notre coutume directive ont déjà transformé les DOM.
Pour plus d'informations à propos de la priorité et de terminal, découvrez Comment comprendre le "terminal" de la directive?
Un exemple d'une directive qui modifie également le modèle est - ng-repeat
(priorité = 1000), lors de l' ng-repeat
est compilé, ng-repeat
faire des copies de l'élément de modèle, avant que d'autres directives appliquées.
Grâce à @Izhaki commentaire, ici, c'est la référence à l' ngRepeat
code source: https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js