¿Cómo podría tener varios casos en una *ngIf
declaración? Estoy acostumbrado a que Vue o Angular 1 tenga un if
, else if
y else
, pero parece que Angular 4 solo tiene una condición true
( if
) y false
( else
).
Según la documentación, solo puedo hacer:
<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>
Pero quiero tener múltiples condiciones (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>
Pero termino teniendo que usar ngSwitch
, lo que se siente como un truco:
<ng-container [ngSwitch]="true">
<div *ngSwitchCase="foo === 1">First</div>
<div *ngSwitchCase="bar === 2">Second</div>
<div *ngSwitchDefault>Third</div>
</ng-container>
Alternativamente, parece que muchas de las sintaxis a las que me he acostumbrado de Angular 1 y Vue no son compatibles con Angular 4, entonces, ¿cuál sería la forma recomendada de estructurar mi código con condiciones como esta?
angular
templates
angular-ng-if
Alexander Abakumov
fuente
fuente
Respuestas:
Otra alternativa es anidar las condiciones.
fuente
<ng-template #second *ngIf="foo === 2;else third">
Puedes usar:
a menos que la parte ng-container sea importante para su diseño, supongo.
Aquí hay un Plunker
fuente
if (index === 1) else if (foo === 2)
tendría que escribirse,if (index === 1) if (index !== 1 && foo === 2)
que es un poco desordenado y más propenso a errores, más veces tenemos que escribir 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 con como * ngTemplateOutlet = "beber; contexto: cerveza", o tal vez otro componente para categorizar.Esta parece ser la forma más limpia de hacer
en la plantilla:
Tenga en cuenta que funciona como
else if
debería funcionar una declaración adecuada cuando las condiciones involucran diferentes variables (solo 1 caso es verdadero a la vez). Algunas de las otras respuestas no funcionan bien en tal caso.aparte: Dios angular, ese es un
else if
código de plantilla realmente feo ...fuente
Puede usar múltiples formas según la situación:
Si su Variable está limitada a un Número o Cadena específicos , la mejor manera es usar ngSwitch o ngIf:
Lo anterior no es adecuado para códigos if elseif else y códigos dinámicos, puede usar el siguiente código:
fuente
*ngIf="foo >= 7; then t7"
lugar de... else t7
.foo >= 4 && foo <= 6; then t46; else t7
deberían funcionar.Para evitar el anidamiento y ngSwitch, también existe esta posibilidad, que aprovecha la forma en que los operadores lógicos funcionan en Javascript:
fuente
O tal vez simplemente use cadenas condicionales con operador ternario.
if … else if … else if … else
cadena.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#Conditional_chains
Me gusta más este enfoque.
fuente
fuente
También puede usar este viejo truco para convertir bloques complejos if / then / else en una declaración de cambio ligeramente más limpia:
fuente