2017-01-20 6 views
0

Ich habe Probleme mit der Art und Weise, wie eckige Direktiven als Attribute verwaltet.Transklusion bei Verwendung der Direktive als Attribut

Ich habe ein Element Richtlinie, die Einbindungen verwenden:

<xx-button>Button!</xx-button> 

Und ich habe eine Richtlinie, die den Inhalt eines Elements ändert sich durch einige andere Richtlinien, es fügt hinzu:

<xx-button xx-modifying-directive>Button!</xx-button> 

Dieser Wille geändert werden zu:

<xx-button some-other-directives> 
    <button>Button!</button> 
</xx-button> 

Wenn ich den Inhalt des Elements in der li kompilieren nking Funktion der xx-modifying-directive Richtlinie, bekomme ich folgende Fehlermeldung:

Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element:

Sie das Problem in diesen JSFiddle deutlicher sehen.

Ich lese das doc oder den Quellcode von ngRepeat Ich sehe nicht, wie ich dieses Problem beheben kann.

Hinweis: Ich brauche mein Element in xx-modifying-directive zu kompilieren, weil diese Richtlinie andere Richtlinien ergänzt, die (in meinem praktischen Fall ich hinzufüge, Hammer-Handler wie hm-pan) kompilieren werden muss.

Update:

genauer Blick, kommt das Problem aus der Tatsache, dass die (ngTransclude-Richtlinie) [https://github.com/angular/angular.js/blob/2a156c2d7ec825ff184480de9aac4b0d7fbd5275/src/ng/directive/ngTransclude.js#L59] nicht die transcluden Funktion übergeben.

Ich weiß immer noch nicht warum, weil es tatsächlich einen Vorfahren hat, für den transclude aktiviert ist (xx-button).

+0

Sie versuchen, das (übergeordnete) Element, für das die Attributrichtlinie deklariert ist, manuell zu kompilieren, was inkorrekt ist und tatsächlich nichts erreicht. Der Kompilierungsdienst sollte mit einer neuen Vorlagenzeichenfolge verwendet werden, die Sie dynamisch generieren. Bitte lesen Sie sich die Servicedokumentation sorgfältig durch, es ist vielleicht eines der komplexesten und schwer verständlichsten Themen. –

+0

Ich glaube, Element repräsentiert , und da Direktiven zu diesem Element hinzugefügt werden, muss es kompiliert werden. –

Antwort

1

Die $transclude Funktion muss $compile bereitgestellt werden. Es wird an die link Funktion übergeben.

link: function(scope, elem, attrs, $transclude) { 
    [...] 
    if ($transclude) { // It can be undefined if not content is provided 
    $compile(element, $transclude)(scope); 
    } 
    [...] 
} 

Wenn Sie tiefer in die Einbindung Busines gehen wollen, folgen Sie diesem link.

Verwandte Themen