J'ai une version très résumée de ce que je fais qui fait passer le problème.
J'ai un simple directive
. Chaque fois que vous cliquez sur un élément, il en ajoute un autre. Cependant, il doit d'abord être compilé afin de le rendre correctement.
Mes recherches m'ont conduit à $compile
. Mais tous les exemples utilisent une structure compliquée que je ne sais pas vraiment comment appliquer ici.
Les violons sont ici: http://jsfiddle.net/paulocoelho/fBjbP/1/
Et le JS est là:
var module = angular.module('testApp', [])
.directive('test', function () {
return {
restrict: 'E',
template: '<p>{{text}}</p>',
scope: {
text: '@text'
},
link:function(scope,element){
$( element ).click(function(){
// TODO: This does not do what it's supposed to :(
$(this).parent().append("<test text='n'></test>");
});
}
};
});
Solution de Josh David Miller: http://jsfiddle.net/paulocoelho/fBjbP/2/
$compile
? Merci pour votre réponse d'ailleurs!$compile
service est ce qui relie les directives et les connecte au cycle d'événements. Il n'y a aucun moyen de contourner$compile
une telle situation, mais dans la plupart des cas une autre directive comme ngRepeat peut accomplir le même travail (donc ngRepeat fait la compilation pour nous). Avez-vous un cas d'utilisation spécifique?En plus de l'exemple parfait de Riceball LEE d'ajouter une nouvelle directive élément
Ajout d'une nouvelle directive attribut à un élément existant peut se faire de cette façon:
Supposons que vous souhaitiez ajouter à la volée
my-directive
l'span
élément.J'espère que cela pourra aider.
la source
Maximum call stack size exceeded
erreur se produit toujours en raison d'une récursion infinie. Je n'ai jamais vu d'instance où l'augmentation de la taille de la pile le résoudrait.L'ajout dynamique de directives sur angularjs a deux styles:
Ajouter une directive angularjs dans une autre directive
insertion d'un nouvel élément (directive)
c'est simple. Et vous pouvez utiliser dans "lien" ou "compiler".
insertion d'un nouvel attribut à l'élément
C'est dur et ça me fait mal à la tête en deux jours.
L'utilisation de "$ compile" soulèvera une erreur récursive critique !! Peut-être qu'il devrait ignorer la directive actuelle lors de la recompilation de l'élément.
Je dois donc trouver un moyen d'appeler la fonction directive "link". Il est très difficile d'obtenir les méthodes utiles qui sont cachées profondément à l'intérieur des fermetures.
Maintenant, ça marche bien.
la source
la source
La réponse acceptée par Josh David Miller fonctionne très bien si vous essayez d'ajouter dynamiquement une directive qui utilise un inline
template
. Cependant, si votre directive profite detemplateUrl
sa réponse, cela ne fonctionnera pas. Voici ce qui a fonctionné pour moi:la source
Josh David Miller a raison.
PCoelho, au cas où vous vous demandez ce qui se
$compile
passe dans les coulisses et comment la sortie HTML est générée à partir de la directive, veuillez jeter un œil ci-dessousLe
$compile
service compile le fragment de HTML ("< test text='n' >< / test >"
) qui inclut la directive ("test" comme élément) et produit une fonction. Cette fonction peut ensuite être exécutée avec une portée pour obtenir la "sortie HTML d'une directive".Plus de détails avec des exemples de code complets ici: http://www.learn-angularjs-apps-projects.com/AngularJs/dynamically-add-directives-in-angularjs
la source
Inspiré de la plupart des réponses précédentes, j'ai trouvé la directive "stroman" suivante qui se remplacera par toutes les autres directives.
Important: enregistrez les directives que vous souhaitez utiliser
restrict: 'C'
. Comme ça:Vous pouvez utiliser comme ceci:
Pour l'obtenir:
Protip. Si vous ne voulez pas utiliser de directives basées sur des classes, vous pouvez changer
'<div></div>'
quelque chose que vous aimez. Par exemple, avoir un attribut fixe qui contient le nom de la directive souhaitée au lieu declass
.la source