Esta não é uma duplicata respondida por esta postagem nem a explicação (correta) do que o operador asterisco faz aqui . No entanto, ele se baseia neles.
O resultado final é que essa *ngBeep
é uma maneira conveniente, sintática e breve de expressão para [ngBeep]
. No entanto, em meu código, usei as seguintes expressões. Eles fazem exatamente a mesma coisa (até onde eu sei) e se comportam conforme o esperado.
<div *ngFor="let item of [1,2,3]">
#{{item}}
<ng-container *ngTemplateOutlet="content"></ng-container>
<ng-container [ngTemplateOutlet]="content"></ng-container>
</div>
Bem... tecnicamente falando, o primeiro é mais curto que o segundo. No entanto, parece bobagem introduzir um operador totalmente novo para eliminar um único caractere. É claro que, para outras diretivas, os caracteres/linhas salvos podem ser bem maiores do que no exemplo específico acima.
Essas duas linhas de contêineres são precisamente equivalentes (neste caso patológico)? Se não, como eles diferem (sob o capô)?
Sim.
No entanto, o açúcar de sintaxe estelar é um pouco mais do que isso. Primeiramente, ele envolve seu conteúdo no
ng-template
(porque você precisa renderizar esse modelo em alguma condição ou, possivelmente, várias vezes, dependendo da diretiva). Significa o seguinte código.Em segundo lugar, adiciona um prefixo para os campos passados, conforme abaixo.
Depois, faz referência aos dados que a própria diretiva fornece no contexto, o que é mais conveniente, assim.
Como você pode ver no código fonte , using
*ngTemplateOutlet
e[ngTemplateOutlet]
não difere, pois você está usando a mesma classe.Olhando para a classe você pode ver esta propriedade:
Isso se traduz nos seguintes trechos sendo equivalentes:
Na verdade, usando a
*
abreviatura você pode especificar as entradas seDirective
forem seguidas por ponto e vírgula.Isto é verdade para todas as directivas estruturais : podem ser usadas referindo-se às suas
selector
ou podem ser usadas com a abreviatura da directiva estrutural .Se você der uma olhada nos documentos que vinculei, verá que, ao usar a
*
abreviação, o Angular envolverá seu elemento em ang-template
e aplicará a diretiva com o seletor a ele:Nos documentos, esses dois modelos são equivalentes :
Você vê que com essas ferramentas poderosas, a complexidade pode aumentar rapidamente, então o Angular não permite 2 diretivas estruturais no mesmo elemento porque é impossível saber previamente qual diretiva deve ter prioridade.
Esta é talvez a única diferença entre as duas abordagens: se quiser usar
ngTemplateOutlet
outra directiva estrutural, tem 2 possibilidades:ng-container
e use a diretiva estrutural em 2 elementos diferentes*
abreviação