Como eu teria vários casos em uma *ngIf
declaração? Estou acostumado a Vue ou angular 1 com ter um if
, else if
e else
, mas parece que Angular 4 tem apenas uma true
( if
) e false
( else
condição).
De acordo com a documentação, só posso fazer:
<ng-container *ngIf="foo === 1; then first else second"></ng-container>
<ng-template #first>First</ng-template>
<ng-template #second>Second</ng-template>
<ng-template #third>Third</ng-template>
Mas eu quero ter várias condições (algo como):
<ng-container *ngIf="foo === 1; then first; foo === 2; then second else third"></ng-container>
<ng-template #first>First</ng-template>
<ng-template #second>Second</ng-template>
<ng-template #third>Third</ng-template>
Mas estou acabando tendo que usar ngSwitch
, o que parece um hack:
<ng-container [ngSwitch]="true">
<div *ngSwitchCase="foo === 1">First</div>
<div *ngSwitchCase="bar === 2">Second</div>
<div *ngSwitchDefault>Third</div>
</ng-container>
Como alternativa, parece que muitas das sintaxes com as quais me acostumei do Angular 1 e Vue não são suportadas no Angular 4, então qual seria a maneira recomendada de estruturar meu código com condições como essa?
angular
templates
angular-ng-if
Alexander Abakumov
fonte
fonte
Respostas:
Outra alternativa é aninhar condições
fonte
<ng-template #second *ngIf="foo === 2;else third">
Você pode apenas usar:
a menos que a parte ng-container seja importante para seu projeto, suponho.
Aqui está um Plunker
fonte
if (index === 1) else if (foo === 2)
teria que ser escrito, oif (index === 1) if (index !== 1 && foo === 2)
que é um pouco confuso e mais sujeito a erros, mais vezes temos que escrever a lógica inversa.if (item === 'food' && kind === 'hamburger') {} else if (item === 'food' && kind === 'hotdog') {} else if (item === 'drink' && kind === 'beer') {} else if (item === 'drink' && kind === 'wine') {} else { /* could be poisonous */ }
NgTemplateOutlet
contexto como * ngTemplateOutlet = "bebida; contexto: cerveja" ou talvez outro componente para categorização.Esta parece ser a maneira mais limpa de fazer
no modelo:
Observe que funciona como uma
else if
instrução apropriada deveria quando as condições envolvem variáveis diferentes (apenas 1 caso é verdadeiro por vez). Algumas das outras respostas não funcionam bem nesse caso.à parte: nossa angular, isso é um
else if
código de modelo realmente feio ...fonte
Você pode usar várias formas com base na situação:
Se sua variável for limitada a um número ou string específico , a melhor maneira é usar ngSwitch ou ngIf:
Acima não é adequado para códigos if elseif e códigos dinâmicos, você pode usar o código abaixo:
fonte
*ngIf="foo >= 7; then t7"
vez de... else t7
.foo >= 4 && foo <= 6; then t46; else t7
devem funcionar.Para evitar aninhamento e ngSwitch, também existe esta possibilidade, que aproveita a maneira como os operadores lógicos funcionam em Javascript:
fonte
Ou talvez apenas use cadeias condicionais com operador ternário.
if … else if … else if … else
corrente.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#Conditional_chains
Eu gosto mais dessa abordagem.
fonte
fonte
Você também pode usar este velho truque para converter blocos if / then / else complexos em uma instrução switch um pouco mais limpa:
fonte