Wie kann ich dynamisch hinzufügen einer Direktive in AngularJS?
Ich habe eine sehr eingekocht version von dem, was ich Tue, wird das problem über.
Habe ich eine einfache directive
. Wenn Sie auf ein element, fügt es einem anderen. Jedoch muss es zuerst kompiliert werden, um zu machen es richtig.
Meine Forschung führte mich zu $compile
. Aber alle Beispiele verwenden eine komplizierte Struktur, dass ich nicht wirklich wissen, wie Sie hier gelten.
Geigen sind hier: http://jsfiddle.net/paulocoelho/fBjbP/1/
Und das JS ist hier:
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/
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie eine Menge von sinnlos jQuery drin, aber die $compile-service ist eigentlich super einfach in diesem Fall:
Sie werden bemerken, ich überarbeitete Sie Ihre Richtlinie zu, um zu Folgen einige bewährte Methoden. Lassen Sie mich wissen, wenn Sie Fragen zu einer von denen.
$compile
oft nicht für die Fälle eingesetzt, dies einfach, weil es in der Regel einfachere Wege, dies zu erreichen, als Sie zu erreichen für$compile
.$compile
? Vielen Dank für deine Antwort, übrigens!$compile
service ist das, was Drähte-Richtlinien und Haken Sie Sie in die event-Zyklus. Es gibt keinen Weg, um$compile
ing in einer situation wie dieser, aber in den meisten Fällen eine Richtlinie wie ngRepeat erreichen können, die den gleichen job (so ngRepeat macht das kompilieren für uns). Sie haben einen speziellen Anwendungsfall?$compile
schien wie eine gute option. Ich dachte über die Verwendung derng-show
Richtlinie, aber es scheint, dass das laden aller möglichen Kontroll-Richtlinien wäre eine Verschwendung. Nochmals vielen Dank!ng-repeat
? Wenn dem so ist, ich weiß nicht, wie dynamisch Anhängencanvas
element, um ein element noch nicht erstelltng-repeat
dass es innerhalbNeben der perfekten Riceball Lees Beispiel des Hinzufügens eines neuen element-Richtlinie
Hinzufügen eines neuen Attribut-Richtlinie auf existierte element könnte getan werden, mit diesem Weg:
Lassen Sie uns sagen Sie, dass Sie hinzufügen möchten auf-der-Fliegen
my-directive
zu denspan
element.Hoffe, das hilft.
Maximum call stack size exceeded
Fehler passiert immer, weil eine unendliche Rekursion. Ich habe noch nie gesehen ein Fall, wo die Erhöhung der stack-Größe würde es lösen.Dynamisch hinzufügen von Richtlinien über angularjs verfügt über zwei Stile:
Fügen Sie eine angularjs-Direktive in eine andere Richtlinie
einfügen eines neuen Elements(Richtlinie)
ist es einfach. Und u können in der "link" oder "kompilieren".
einfügen eines neuen Attributs von element
Es ist schwer, und machen mir Kopfschmerzen innerhalb von zwei Tagen.
Per "$compile" erhöhen kritische rekursive Fehler!! Vielleicht sollte es ignorieren der geltenden Richtlinie bei der re-kompilieren-element.
So, ich habe einen Weg zu finden, rufen Sie die Richtlinie "link" - Funktion. Es ist sehr schwer zu bekommen, die nützliche Methoden, die versteckt tief im inneren Verschlüsse.
Nun, Es ist gut funktionieren.
Die akzeptierte Antwort von Josh David Miller funktioniert großartig, wenn Sie versuchen, um dynamisch hinzufügen einer Richtlinie für die Verwendung eines inline -
template
. Allerdings, wenn Ihre Richtlinie nutzttemplateUrl
seine Antwort wird nicht funktionieren. Hier ist was für mich gearbeitet:Josh David Miller, der richtige ist.
PCoelho, Im Falle dass Sie sich Fragen, was
$compile
hinter den kulissen tut und wie die HTML-Ausgabe generiert sich aus der Richtlinie, werfen Sie bitte einen Blick untenDen
$compile
service kompiliert das fragment von HTML ("< test text='n' >< /test >"
), enthält die Richtlinie("test" als ein element) und erzeugt eine Funktion. Diese Funktion kann auch dann ausgeführt werden, mit einem Umfang, um die "HTML-Ausgabe aus der Richtlinie".Mehr details mit full-code-Beispiele hier:
http://www.learn-angularjs-apps-projects.com/AngularJs/dynamically-add-directives-in-angularjs
Inspiriert durch viele der bisherigen Antworten, die ich habe, kam mit der folgenden "stroman" Richtlinie ersetzen wird, sich mit anderen Richtlinien.
Wichtig: Registrieren Sie die Richtlinien, die Sie verwenden möchten, mit
restrict: 'C'
. Wie diese:Können Sie verwenden, wie diese:
Um dies zu erhalten:
Protip. Wenn Sie nicht möchten, verwenden Sie die Richtlinien basieren auf Klassen, die Sie ändern können
'<div></div>'
zu etwas, was Sie mögen. E. g. haben ein festes Attribut enthält den Namen der gewünschten Richtlinie stattclass
.