Ich experimentiere mit angle2 2.0.0-beta.0
Ich habe eine Tabelle und der Zeileninhalt wird von angle2 folgendermaßen generiert:
<table>
<tr *ngFor="#line of data">
.... content ....
</tr>
</table>
Jetzt funktioniert dies und ich möchte den Inhalt in eine Komponente "Tabellenzeile" einkapseln.
<table>
<table-line *ngFor="#line of data" [data]="line">
</table-line>
</table>
In der Komponente enthält die Vorlage den Inhalt <tr> <td>.
Aber jetzt funktioniert der Tisch nicht mehr. Das heißt, der Inhalt wird nicht mehr in Spalten angezeigt. Im Browser zeigt mir der Inspektor, dass die DOM-Elemente folgendermaßen aussehen:
<table>
<table-line ...>
<tbody>
<tr> ....
Wie kann ich das zum Laufen bringen?
tr
Tag enthält, wird es verwendet, andernfalls findet das Standardverhalten des Browsers statt. Sie können Ihrem Komponenten-Selektor auch Attribute oder Klassen hinzufügen, z. B.<tr line-item>
mit einem Komponenten-Selektor"tr[line-item] "
oder<tr class="line-item">
mit einem Komponenten-Selektortr.line-item
. Auf diese Weise haben Sie die volle Kontrolle. Ich habe selbst noch nichts davon in Angular2 ausprobiert, aber ich bin mir ziemlich sicher, dass dies funktioniert.tslint
direkt mich zum Style Guide empfiehlt gegen diesen. Ich mag es nicht, empfohlene Flusenregeln auszuschalten, aber soweit ich das beurteilen kann, scheint es eine ziemlich willkürliche Regel zu sein, die in einigen Situationen (wie dem Problem von OP) unvermeidbar ist<li>
oder ähnliches gibt, sehe ich keinen Grund, warum ich ihn nicht verwenden sollte.Ich fand das Beispiel sehr nützlich, aber es funktionierte im 2.2.3-Build nicht. Nach langem Kopfkratzen funktionierte es mit ein paar kleinen Änderungen wieder.
quelle
MyTrComponent
zumapp.module.ts
und funktioniert gut.Hier ist ein Beispiel für die Verwendung einer Komponente mit einem Attributselektor:
Ausgabe:
Natürlich wäre die Vorlage in der MyTrComponent komplizierter, aber Sie haben die Idee.
Alter (Beta.0) Plunker .
quelle
Error: Uncaught (in promise): Error: Template parse errors: Can't bind to 'myTr' since it isn't a known property of 'tr'.
Das Hinzufügen von 'display: content' zum Komponentenstil hat für mich funktioniert.
CSS:
HTML:
Warum funktioniert das?
Wenn Sie eine Komponente instanziieren, wird der Inhalt der Komponente wie im Winkel (nach dem Kompilieren) wie folgt in das DOM eingeschlossen:
Damit die Tabelle jedoch ordnungsgemäß angezeigt wird, können die
tr
Tags von nichts umbrochen werden.Also fügen wir
display: contents
diesem neuen Element hinzu. Soweit ich weiß, bedeutet dies, dem Explorer mitzuteilen, dass dieses Tag nicht gerendert werden soll, und den inneren Inhalt so anzuzeigen, als ob kein Umbruch stattgefunden hätte. Während das Tag noch vorhanden ist, wirkt es sich nicht visuell auf die Tabelle aus, und dietr
Tags werden so behandelt, als wären sie direkte untergeordnete Elemente destable
Elemente Tags.Wenn Sie weitere Informationen zur Funktionsweise von Inhalten benötigen: https://bitsofco.de/how-display-contents-works/
quelle
contents
funktioniert, deshalb wollte ich keine Informationen auf der Grundlage falscher Annahmen veröffentlichen ... Ich habe die Erklärung so hinzugefügt, wie ich sie verstehe, aber wenn jemand bemerkt, dass ein Fehler vorliegt, können Sie ihn gerne darauf hinweisen ^ ^. Ich habe auch einen Link hinzugefügt, damit die Leute weitere Nachforschungen anstellen können ... Eine Sache, die mir aufgefallen ist, obwohl es heißt, dass dies unter IE11 nicht funktioniert, habe ich unter IE 11.657.18362.0 ausprobiert und es hat gut funktioniert (aber da ich es bin Bei Verwendung von Angular könnte es irgendwo eine Polyfüllung geben, daher würde ich dies in anderen Umgebungen nicht zu 100% garantieren.)Versuche dies
quelle