Update:Richtiger Weg Wrapperkomponenten in Angular 4 zu implementieren?
Die richtige Frage ist wahrscheinlich:. "Wie kann ich meine eigene Version von ng-container
implementieren, so kann ich" <my-component ...>...</my-component>
"statt" <ng-container my-directive ...>...</ng-container>
“
Ich entwickle eine neue App in Angular 4 Ich möchte meine gesamte App mit Wrapper-Komponenten erstellen, damit ich bei Bedarf die eigentlichen Komponenten austauschen kann.Dies funktioniert problemlos für einfache Steuerelemente, aber nicht für komplexe Steuerelemente, die wir in separate Komponenten aufteilen möchten Die Anforderungen sind ziemlich stabil: eine Liste von Registerkarten mit Beschriftungen und Inhaltsfenstern, die wir ein-/ausblenden
ng-Bootstrap kann so etwas wie folgt verwenden:
<div class="my-tab-group">
<ul>
<li>Tab 1</li>
...
</ul>
<div class="my-tab" title="Tab 1">...</div>
...
</div>
Statt binden meine app zu dieser Zeit möchte ich auf eine bestimmte Implementierung meine definieren:
<ngb-tabset>
<ngb-tab title="Tab 1">
<ng-template ngbTabContent>...</ng-template>
</ngb-tab>
...
<ngb-tabset>
wir so eine andere Komponente aufweisen eigene Wrapper-Tabs und es so überall verwenden:
<my-tabs-control>
<my-tab-control title="Tab 1">...</my-tab-control>
...
<my-tabs-control>
Dann, wenn ich die Möglichkeit, meine Tabs ändern müssen arbeiten, um es an einem Ort geschieht. Wenn wir jedoch eine Wrapper-Komponente verwenden, wird der HTML-Code mit den Host-Element-Tags verschmutzt, die mit den gewünschten Tags verschachtelt sind, was offensichtlich Dinge vermasselt, z.
<my-tabs-control>
<div class="my-tab-group">
<ul>
<li>Tab 1</li>
...
</ul>
<my-tab-control title="Tab 1">
<div class="my-tab" title="Tab 1">...</div>
</my-tab-control>
...
</div>
<my-tabs-control>
Meine Vermutung ist dies der Grund, warum viele Leute fragen, wie das Host-Element in einer Winkelkomponente auszupacken/entfernen - dass dies wirklich einfach machen würde, zu tun.
Die übliche Antwort ist stattdessen Attributselektoren zu verwenden, zB:
Remove the angular2 component's selector tag
How to remove/replace the angular2 component's selector tag from HTML
Dies bedeutet jedoch, müssen wir die Tag-Struktur am Einsatzort wissen, was offensichtlich die zerstört ganzer Punkt der Verwendung von gut benannten Wrapper-Tags.
So endlich, wie soll ich das tun? Ist es vielleicht aus Leistungsgründen nicht möglich? Ich habe angefangen, Renderer2 zu betrachten, habe aber keine offensichtliche Möglichkeit gefunden, das zu tun, was ich will, und ich möchte nicht-eckige DOM-Hacks vermeiden.
Sieht aus wie Sie 'Einbindung' mit ng-Inhalt verwenden möchten: https://scotch.io/tutorials/angular-2-transclusion-using- ng-content Official angular docs scheinen das zu vermissen: https://github.com/angular/angular.io/issues/3099 – marvini
Ich benutze ng-content schon viel für projizierten Inhalt, aber das behebt das Problem nicht der Wrapper/Container-Tags, die von der Komponente selbst erstellt wurden. Wir können bekommen, was wir wollen, indem wir ng-container mit einer Direktive anstelle einer Komponente verwenden, aber das sieht chaotisch aus. Wir können vielleicht eine Direktive mit einem Elementselektor anstelle des Standardattributselektors verwenden und dann (vielleicht?) Renderer2/code verwenden, um den Inhalt zu rendern. Was ich wirklich will, ist ein Schalter, um einfach zu sagen: "render den Inhalt dieser Komponente ohne das Wrapper/Container/Host-Element. Leider denke ich, dass das nicht möglich ist. – Etherman