Eksperymentuję z angular2 2.0.0-beta.0
Mam tabelę, a zawartość linii jest generowana przez angular2 w ten sposób:
<table>
<tr *ngFor="#line of data">
.... content ....
</tr>
</table>
Teraz to działa i chcę zawrzeć zawartość w komponencie „wiersz tabeli”.
<table>
<table-line *ngFor="#line of data" [data]="line">
</table-line>
</table>
W komponencie szablon ma zawartość <tr> <td>.
Ale teraz stół już nie działa. Co oznacza, że treść nie jest już wyświetlana w kolumnach. W przeglądarce inspektor pokazuje mi, że elementy DOM wyglądają tak:
<table>
<table-line ...>
<tbody>
<tr> ....
Jak mogę to zrobić?
tr
tag niestandardowy , zostanie on użyty, w przeciwnym razie ma miejsce domyślne zachowanie przeglądarki. Możesz także dodawać atrybuty lub klasy do selektora komponentów, tak jak<tr line-item>
selektor komponentów"tr[line-item] "
lub<tr class="line-item">
selektor komponentówtr.line-item
. W ten sposób masz pełną kontrolę. Sam jeszcze nie próbowałem tego w Angular2, ale jestem prawie pewien, że to działa.tslint
kierują mnie do przewodnika stylów, który jest zalecany przeciwko temu. Nie podoba mi się wyłączanie zalecanych reguł lintingu, ale o ile wiem, wydaje mi się, że jest to zasada dość arbitralna i nieunikniona w niektórych sytuacjach (takich jak problem OP)<li>
lub podobne, nie widzę powodu, aby go nie używać.Uważam, że przykład jest bardzo przydatny, ale nie działał w kompilacji 2,2.3, więc po wielu drapaniach po głowie sprawił, że działał ponownie z kilkoma drobnymi zmianami.
źródło
MyTrComponent
doapp.module.ts
i działa dobrze.Oto przykład użycia komponentu z selektorem atrybutu:
Wynik:
Oczywiście szablon w MyTrComponent byłby bardziej zaangażowany, ale masz pomysł.
Stary (beta.0) plunker .
źródło
Error: Uncaught (in promise): Error: Template parse errors: Can't bind to 'myTr' since it isn't a known property of 'tr'.
Dodanie „display: content” do stylu komponentu wypracowało mi się.
CSS:
HTML:
Dlaczego to działa?
Podczas instancji komponentu angular (po kompilacji) opakowuje zawartość komponentu w DOM w następujący sposób:
Ale aby tabela wyświetlała się poprawnie,
tr
tagi nie mogą być niczym opakowane.Więc dodajemy
display: contents
do tego nowego elementu. Jak rozumiem, ma to na celu poinformowanie eksploratora, że ten tag nie powinien być renderowany, i wyświetlenie wewnętrznej zawartości tak, jakby nie było zawijania. Tak więc, gdy tag nadal istnieje, nie wpływa wizualnie na tabelę, atr
tagi są traktowane tak, jakby były bezpośrednimi elementamitable
podrzędnymi tagu.Jeśli chcesz dokładniej zbadać, jak działa zawartość: https://bitsofco.de/how-display-contents-works/
źródło
contents
działa, więc nie chciałem tam umieszczać informacji opartych na fałszywych założeniach ... Dodałem wyjaśnienie tak, jak je rozumiem, ale jeśli ktoś zauważy, że jest w nim błąd, to śmiało wskaż go ^ ^. Dodałem również link, aby ludzie mogli dalej badać ... Jedna rzecz, którą zauważyłem, chociaż mówi, że to nie działa na IE11, wypróbowałem to na IE 11.657.18362.0 i działało dobrze (ale ponieważ jestem używając kątownika, może gdzieś być polyfill, więc nie gwarantuję tego w 100% w innych środowiskach)Spróbuj tego
źródło