Estou experimentando o angular2 2.0.0-beta.0
Eu tenho uma tabela e o conteúdo da linha é gerado pelo angular2 desta forma:
<table>
<tr *ngFor="#line of data">
.... content ....
</tr>
</table>
Agora isso funciona e eu quero encapsular o conteúdo em um componente "linha de tabela".
<table>
<table-line *ngFor="#line of data" [data]="line">
</table-line>
</table>
E no componente, o template possui o conteúdo <tr> <td>.
Mas agora a mesa não funciona mais. O que significa que o conteúdo não é mais mostrado em colunas. No navegador, o inspetor me mostra que os elementos DOM têm a seguinte aparência:
<table>
<table-line ...>
<tbody>
<tr> ....
Como posso fazer isso funcionar?
tr
tag será usado, caso contrário é o comportamento padrão do navegador ocorre. Você também pode adicionar atributos ou classes ao seu seletor de componente como<tr line-item>
com um seletor de componente"tr[line-item] "
ou<tr class="line-item">
com um seletor de componentetr.line-item
. Dessa forma, você tem controle total. Ainda não tentei nada disso no Angular2, mas tenho certeza de que funciona.tslint
direcionam-me para o guia de estilo que recomenda contra isso. Não gosto de desligar as regras de linting recomendadas, mas pelo que posso dizer, parece uma regra de estilo bastante arbitrário e inevitável em algumas situações (como o problema de OP)<li>
ou similares, não vejo razão para não usá-lo.Achei o exemplo muito útil, mas ele não funcionou na compilação 2.2.3, então depois de muito mexer na cabeça, ele voltou a funcionar com algumas pequenas alterações.
fonte
MyTrComponent
aoapp.module.ts
e funciona bem.Aqui está um exemplo de uso de um componente com um seletor de atributo:
Resultado:
Claro que o modelo no MyTrComponent seria mais envolvido, mas você entendeu.
Velho (beta.0) Plunker .
fonte
Error: Uncaught (in promise): Error: Template parse errors: Can't bind to 'myTr' since it isn't a known property of 'tr'.
Adicionar 'display: contents' ao estilo de componente funcionou para mim.
CSS:
HTML:
Por que isso funciona?
Ao criar a instância de um componente, angular (após compilar) envolve o conteúdo do componente no DOM da seguinte maneira:
Mas, para que a tabela seja exibida corretamente, as
tr
tags não podem ser envolvidas por nada.Então, nós adicionamos
display: contents
, a este novo elemento. Pelo que entendi, o que isso significa é dizer ao explorador que essa tag não deve ser renderizada e exibir o conteúdo interno como se não houvesse enrolamento. Portanto, enquanto a tag ainda existe, ela não afeta visualmente a tabela, e astr
tags são tratadas como se fossem filhos diretos datable
tag.Se você gostaria de investigar mais sobre como o conteúdo funciona: https://bitsofco.de/how-display-contents-works/
fonte
contents
funciona, então não queria colocar lá informações baseadas em falsas suposições ... Eu adicionei a explicação como a entendi, mas se alguém perceber que há um erro nela, fique à vontade para apontá-lo ^ ^. Eu também adicionei um link para que as pessoas possam investigar mais ... Uma coisa eu percebi, embora ele diga que isso não funciona no IE11, eu tentei no IE 11.657.18362.0 e funcionou bem (mas, como estou usando angular, pode haver um polyfill em algum lugar, então eu não garantiria 100% em outros ambientes)tente isso
fonte