Ich habe eine sehr heruntergekommene Version von dem, was ich tue, die das Problem vermittelt.
Ich habe eine einfache directive
. Wenn Sie auf ein Element klicken, wird ein weiteres hinzugefügt. Es muss jedoch zuerst kompiliert werden, um es korrekt zu rendern.
Meine Forschung führte mich zu $compile
. Aber alle Beispiele verwenden eine komplizierte Struktur, die ich hier nicht wirklich anwenden kann.
Geigen sind hier: http://jsfiddle.net/paulocoelho/fBjbP/1/
Und der JS ist da:
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>");
});
}
};
});
Lösung von Josh David Miller: http://jsfiddle.net/paulocoelho/fBjbP/2/
$compile
? Danke übrigens für deine Antwort!$compile
Dienst die Anweisungen verkabelt und sie in den Ereigniszyklus einbindet.$compile
In einer solchen Situation führt kein Weg daran vorbei, aber in den meisten Fällen kann eine andere Direktive wie ngRepeat den gleichen Job ausführen (also übernimmt ngRepeat das Kompilieren für uns). Haben Sie einen bestimmten Anwendungsfall?Neben dem perfekten Beispiel von Riceball LEE für das Hinzufügen einer neuen Element-Direktive
Das Hinzufügen einer neuen Attribut-Direktive zu einem vorhandenen Element kann folgendermaßen erfolgen:
Angenommen, Sie möchten
my-directive
dasspan
Element im laufenden Betrieb hinzufügen .Hoffentlich hilft das.
quelle
Maximum call stack size exceeded
Fehler tritt immer aufgrund einer unendlichen Rekursion auf. Ich habe noch nie einen Fall gesehen, in dem eine Erhöhung der Stapelgröße das Problem lösen würde.Das dynamische Hinzufügen von Direktiven zu anglejs hat zwei Stile:
Fügen Sie eine Angularjs-Direktive in eine andere Direktive ein
Einfügen eines neuen Elements (Direktive)
Es ist einfach. Und du kannst in "Link" oder "Kompilieren" verwenden.
Einfügen eines neuen Attributs in das Element
Es ist schwer und macht mir innerhalb von zwei Tagen Kopfschmerzen.
Die Verwendung von "$ compile" führt zu einem kritischen rekursiven Fehler !! Möglicherweise sollte die aktuelle Anweisung beim erneuten Kompilieren des Elements ignoriert werden.
Ich muss also einen Weg finden, die Direktivenfunktion "link" aufzurufen. Es ist sehr schwer, die nützlichen Methoden zu finden, die tief in Verschlüssen verborgen sind.
Jetzt funktioniert es gut.
quelle
quelle
Die akzeptierte Antwort von Josh David Miller funktioniert hervorragend, wenn Sie versuchen, dynamisch eine Direktive hinzuzufügen, die eine Inline verwendet
template
. Wenn Ihre Direktive jedochtemplateUrl
seine Antwort ausnutzt, funktioniert dies nicht. Folgendes hat bei mir funktioniert:quelle
Josh David Miller ist richtig.
PCoelho, Falls Sie sich fragen, was
$compile
sich hinter den Kulissen abspielt und wie die HTML-Ausgabe aus der Direktive generiert wird, schauen Sie bitte unten nachDer
$compile
Dienst kompiliert das Fragment von HTML ("< test text='n' >< / test >"
), das die Direktive enthält ("test" als Element), und erzeugt eine Funktion. Diese Funktion kann dann mit einem Bereich ausgeführt werden, um die "HTML-Ausgabe von einer Direktive" zu erhalten.Weitere Details mit vollständigen Codebeispielen finden Sie hier: http://www.learn-angularjs-apps-projects.com/AngularJs/dynamically-add-directives-in-angularjs
quelle
Inspiriert von vielen der vorherigen Antworten habe ich die folgende "stroman" -Richtlinie entwickelt, die sich durch andere Richtlinien ersetzen wird.
Wichtig: Registrieren Sie die Anweisungen, mit denen Sie verwenden möchten
restrict: 'C'
. So was:Sie können wie folgt verwenden:
Um dies zu bekommen:
Protip. Wenn Sie keine auf Klassen basierenden Anweisungen verwenden möchten, können Sie
'<div></div>'
zu etwas wechseln , das Ihnen gefällt. ZB haben Sie ein festes Attribut, das den Namen der gewünschten Direktive anstelle von enthältclass
.quelle