Ich kämpfe darum, einen Weg zu finden, dies zu tun. In einer übergeordneten Komponente beschreibt die Vorlage ein table
und sein thead
Element, delegiert das Rendern jedoch tbody
an eine andere Komponente wie folgt:
<table>
<thead>
<tr>
<th>Name</th>
<th>Time</th>
</tr>
</thead>
<tbody *ngFor="let entry of getEntries()">
<my-result [entry]="entry"></my-result>
</tbody>
</table>
Jede myResult-Komponente rendert im tr
Grunde genommen ein eigenes Tag:
<tr>
<td>{{ entry.name }}</td>
<td>{{ entry.time }}</td>
</tr>
Der Grund, warum ich dies nicht direkt in die übergeordnete Komponente einfüge (ohne dass eine myResult-Komponente erforderlich ist), ist, dass die myResult-Komponente tatsächlich komplizierter ist als hier gezeigt. Daher möchte ich ihr Verhalten in eine separate Komponente und Datei einfügen.
Das resultierende DOM sieht schlecht aus. Ich glaube, das liegt daran, dass es ungültig ist, da tbody
es nur tr
Elemente enthalten kann (siehe MDN) , aber mein generiertes (vereinfachtes) DOM ist:
<table>
<thead>
<tr>
<th>Name</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<my-result>
<tr>
<td>Bob</td>
<td>128</td>
</tr>
</my-result>
</tbody>
<tbody>
<my-result>
<tr>
<td>Lisa</td>
<td>333</td>
</tr>
</my-result>
</tbody>
</table>
Gibt es eine Möglichkeit, dasselbe zu rendern, aber ohne die Umhüllung? <my-result>
zu rendern Tag, und während weiterhin eine Komponente verwenden, um allein für das Rendern einer Tabellenzeile verantwortlich zu sein?
Ich habe betrachtet ng-content
, DynamicComponentLoader
die ViewContainerRef
, aber sie scheinen nicht , eine Lösung für diese zu schaffen , soweit ich sehen kann.
quelle
Antworten:
Sie können Attributselektoren verwenden
und dann benutze es gerne
quelle
[]
? Haben Sie die Komponentedeclarations: [...]
eines Moduls hinzugefügt ? Wenn die Komponente in einem anderen Modul registriert ist, haben Sie dieses andere Modul zuimports: [...]
dem Modul hinzugefügt, in dem Sie die Komponente verwenden möchten?setAttribute
ist nicht mein Code. Aber ich habe es herausgefunden, ich musste das eigentliche Tag der obersten Ebene in meiner Vorlage als Tag für meine Komponente verwenden, anstattng-container
so neu zu arbeiten<ul smMenu class="nav navbar-nav" [submenus]="root?.Submenus" [title]="root?.Title"></ul>
<ul class="nav navbar-nav"> <li-navigation [navItems]="menuItems"></li-navigation> </ul>
Ich habe dies verwendet (nachdem ich die Navigation in einen Attributselektor geändert hatte)<ul class="nav navbar-nav" li-navigation [navItems]="menuItems"></ul>
Sie benötigen "ViewContainerRef" und tun in meiner Ergebniskomponente Folgendes:
html:
ts:
quelle
@ViewChild('template', {static: true}) template;
my-result
neuemy-result
Geschwister erstellt werden müssen. Stellen Sie sich also vor, Sie haben eine Hierarchie, in dermy-result
jede Zeile "untergeordnete" Zeilen haben kann. In diesem Fall würde die Verwendung eines Attributselektors nicht funktionieren, da der erste Selektor in den gehttbody
, der zweite jedoch weder in einen internentbody
noch in einentr
.Verwenden Sie diese Anweisung für Ihr Element
Anwendungsbeispiel:
und im übergeordneten HTML rufen Sie das Kartenelement wie gewohnt auf, zum Beispiel:
Die Ausgabe wird sein:
quelle
Attributselektoren sind der beste Weg, um dieses Problem zu lösen.
Also in deinem Fall:
meine Ergebnisse ts
my-results html
Mein Ergebnis ts
Mein Ergebnis HTML
Siehe Stackblitz: https://stackblitz.com/edit/angular-xbbegx
quelle
Sie können versuchen, das neue CSS zu verwenden
display: contents
Hier ist meine Symbolleiste scss:
und das HTML:
und in Gebrauch:
quelle
Eine weitere Option ist heutzutage die
ContribNgHostModule
aus dem Paket zur Verfügung gestellte@angular-contrib/common
.Nach dem Import des Moduls können Sie
host: { ngNoHost: '' }
es Ihrem@Component
Dekorateur hinzufügen und es wird kein Wrapping-Element gerendert.quelle