Экспериментирую с angular2 2.0.0-beta.0
У меня есть таблица, и содержимое строки создается angular2 следующим образом:
<table>
<tr *ngFor="#line of data">
.... content ....
</tr>
</table>
Теперь это работает, и я хочу инкапсулировать контент в компонент «table-line».
<table>
<table-line *ngFor="#line of data" [data]="line">
</table-line>
</table>
А в компоненте шаблон имеет содержимое <tr> <td>.
Но теперь таблица больше не работает. Это означает, что содержимое больше не отображается в столбцах. В браузере инспектор показывает мне, что элементы DOM выглядят так:
<table>
<table-line ...>
<tbody>
<tr> ....
Как я могу заставить это работать?
tr
тег, он будет использован, в противном случае - поведение браузера по умолчанию. Вы также можете добавлять атрибуты или классы в свой селектор компонентов, например,<tr line-item>
с помощью селектора компонентов"tr[line-item] "
или<tr class="line-item">
селектора компонентовtr.line-item
. Таким образом, у вас будет полный контроль. Я сам еще не пробовал ничего из этого в Angular2, но уверен, что это работает.tslint
прямого меня к руководству по стилю рекомендуя против этого. Мне не нравится отключать рекомендуемые правила линтинга, но, насколько я могу судить, это кажется довольно произвольным стилевым правилом и неизбежным в некоторых ситуациях (например, проблема OP)<li>
то подобное, я не вижу причин, почему бы не использовать его.Я нашел этот пример очень полезным, но он не работал в сборке 2.2.3, поэтому после долгой царапины в голове он снова заработал с небольшими изменениями.
источник
MyTrComponent
в,app.module.ts
и все работает нормально.Вот пример использования компонента с селектором атрибутов:
Вывод:
Конечно, шаблон в MyTrComponent будет более сложным, но вы поняли идею.
Старый (beta.0) плункер .
источник
Error: Uncaught (in promise): Error: Template parse errors: Can't bind to 'myTr' since it isn't a known property of 'tr'.
Добавление display: contents в стиль компонента сработало для меня.
CSS:
HTML:
Почему это работает?
При создании экземпляра компонента angular (после компиляции) обертывает содержимое компонента в DOM следующим образом:
Но для правильного отображения таблицы
tr
теги нельзя ничем обернуть.Итак, мы добавляем
display: contents
к этому новому элементу. Насколько я понимаю, это означает, что проводник сообщает, что этот тег не должен отображаться, и отображает внутреннее содержимое, как если бы не было обертывания. Таким образом, хотя тег все еще существует, он не влияет на визуально таблицу, аtr
теги обрабатываются так, как если бы они были прямыми дочерними элементамиtable
тега.Если вы хотите подробнее узнать, как работает контент: https://bitsofco.de/how-display-contents-works/
источник
contents
работает, поэтому я не хотел помещать туда информацию, основанную на ложных предположениях ... Я добавил объяснение, как я его понимаю, но если кто-то заметит, что в нем есть ошибка, пожалуйста, не стесняйтесь указать на это ^ ^. Я также добавил ссылку, чтобы люди могли продолжить расследование ... Одна вещь, которую я заметил, хотя там говорится, что это не работает в IE11, я попробовал это на IE 11.657.18362.0, и он работал нормально (но, поскольку я используя angular, где-то может быть полифилл, поэтому я не могу гарантировать его 100% в других средах)попробуй это
источник