if else istruzione nei modelli AngularJS


702

Voglio fare una condizione in un modello AngularJS. Ricevo un elenco di video dall'API di Youtube. Alcuni video sono in formato 16: 9 e altri in formato 4: 3.

Voglio creare una condizione come questa:

if video.yt$aspectRatio equals widescreen then 
    element's attr height="270px"
else
    element's attr height="360px"

Sto iterando i video usando ng-repeat. Non ho idea di cosa dovrei fare per questa condizione:

  • Aggiungere una funzione nell'ambito?
  • Farlo nel modello?

2
Ho trovato un articolo ng-if qui. goo.gl/wQ30uf
virender

Risposte:


1284

Angularjs (versioni precedenti alla 1.1.5) non fornisce la if/elsefunzionalità. Di seguito sono riportate alcune opzioni da considerare per ciò che si desidera ottenere:

( Vai all'aggiornamento di seguito (n. 5) se stai utilizzando la versione 1.1.5 o successiva )

1. Operatore ternario:

Come suggerito da @Kirk nei commenti, il modo più pulito per farlo sarebbe usare un operatore ternario come segue:

<span>{{isLarge ? 'video.large' : 'video.small'}}</span>

2. ng-switchdirettiva:

può essere usato qualcosa di simile al seguente.

<div ng-switch on="video">
    <div ng-switch-when="video.large">
        <!-- code to render a large video block-->
    </div>
    <div ng-switch-default>
        <!-- code to render the regular video block -->
    </div>
</div>

3. ng-hide/ ng-showdirettive

In alternativa, potresti anche usare, ng-show/ng-hidema l'utilizzo di questo renderà effettivamente sia un video di grandi dimensioni che un piccolo elemento video e quindi nasconderà quello che soddisfa la ng-hidecondizione e mostra quello che soddisfa la ng-showcondizione. Quindi, in ogni pagina, verranno visualizzati due elementi diversi.

4. Un'altra opzione da considerare è la ng-classdirettiva.

Questo può essere usato come segue.

<div ng-class="{large-video: video.large}">
    <!-- video block goes here -->
</div>

Quanto sopra sostanzialmente aggiungerà una large-videoclasse CSS all'elemento div se video.largeè vero.

AGGIORNAMENTO: Angular 1.1.5 ha introdotto ilngIf directive

5. ng-ifdirettiva:

Nelle versioni precedenti 1.1.5è possibile utilizzare la ng-ifdirettiva. Ciò rimuove l'elemento se l'espressione fornita ritorna falsee reinserisce il elementnel DOM se l'espressione ritorna true. Può essere usato come segue.

<div ng-if="video == video.large">
    <!-- code to render a large video block-->
</div>
<div ng-if="video != video.large">
    <!-- code to render the regular video block -->
</div>

9
Dovrebbe essere ng-switch on="video"inveceng-switch-on="video"
Czerasz

4
Come si fa? if () {} else if () {} else if () {} else {} Ma includi in dom un solo elemento
falko,

208
Anche ternario<span>{{isAdded ? 'Added' : 'Add to cart'}}</span>
Kirk Strobeck il

16
Tenere presente che ng-ifNON aggiungere gli elementi racchiusi al DOM fino a quando la sua condizione non viene valutata true, diversamente da ng-hidee ng-show.
Wilhelm Murdoch,

1
Perché non semplicemente ng-switch="video"? Alcuni problemi? o non era disponibile prima? Per me funziona abbastanza bene
Sami,

175

Nell'ultima versione di Angular (dalla 1.1.5), hanno incluso una direttiva condizionale chiamata ngIf. È diverso da ngShowe ngHidein quanto gli elementi non sono nascosti, ma non sono affatto inclusi nel DOM. Sono molto utili per i componenti che sono costosi da creare ma non utilizzati:

<div ng-if="video == video.large">
    <!-- code to render a large video block-->
</div>
<div ng-if="video != video.large">
    <!-- code to render the regular video block -->
</div>

5
Tieni presente che ng-ifintroduce un ambito isolato , in modo che $parentdiventi $parent.$parentnel corpo di ng-if.
David Salamon,

142

Ternary è il modo più chiaro per farlo.

<div>{{ConditionVar ? 'varIsTrue' : 'varIsFalse'}}</div>

Devo farlo con 2 condizioni in o ?? come <div> {{A == B || A == C? 'varIsTrue': 'varIsFalse'}} </div>
YoBre,

2
Avvolgilo (A == B || A == C)
Oliver Dixon

1
amo questa risposta! L'uso di ng-direttive fornisce molti spazi bianchi html se un div non soddisfa la condizione ..
sksallaj

48

Angular stesso non fornisce la funzionalità if / else, ma puoi ottenerlo includendo questo modulo:

https://github.com/zachsnow/ng-elif

In parole sue, è solo "una semplice raccolta di direttive sul flusso di controllo: ng-if, ng-else-if e ng-else". È facile e intuitivo da usare.

Esempio:

<div ng-if="someCondition">
    ...
</div>
<div ng-else-if="someOtherCondition">
    ...
</div>
<div ng-else>
    ...
</div>

1
non voglio ripetere il codice in div ancora e ancora.

1
Non devi ripetere nulla, potresti farlo facilmente ng-if="someCondition && someOtherCondition". Forse fraintendere? (Ho scritto che il modulo - dovrebbe funzionare proprio come ife elsein JS).
Zach Snow,

1
Questo è un vero toccasana. Questo dovrebbe far parte del nucleo angolare, è indispensabile nella codifica dei modelli. Molto più pulito di avere operatori ternari in tutto il luogo e supera i limiti di ng-switch che non è in grado di valutare le espressioni.
Nico Westerdale,

Grazie @NicoWesterdale! Inoltre, ho aggiunto una versione più ricca di ng-switch che potresti trovare utile: github.com/zachsnow/ng-cases
Zach Snow

30

È possibile utilizzare video.yt$aspectRatiodirettamente la proprietà passandola attraverso un filtro e associando il risultato all'attributo height nel modello.

Il tuo filtro sarebbe simile a:

app.filter('videoHeight', function () {
  return function (input) {
    if (input === 'widescreen') {
      return '270px';
    } else {
      return '360px';
    }
  };
});

E il modello sarebbe:

<video height={{video.yt$aspectRatio | videoHeight}}></video>

Che ne dici del tuo codice quando video.yt$aspectRatioè vuoto o indefinito? È possibile applicare un valore predefinito?
Fractaliste,

13

In questo caso, si desidera "calcolare" un valore in pixel in base alla proprietà di un oggetto.

Definirei una funzione nel controller che calcola i valori dei pixel.

Nel controller:


$scope.GetHeight = function(aspect) {
   if(bla bla bla) return 270;
   return 360;
}

Quindi nel tuo modello scrivi semplicemente:


element height="{{ GetHeight(aspect) }}px "

11

Sono d'accordo che un ternario è estremamente pulito. Sembra che sia molto situazionale anche se come qualcosa ho bisogno di visualizzare div o p o table, quindi con un tavolo non preferisco un ternario per ovvi motivi. Effettuare una chiamata a una funzione è in genere l'ideale o nel mio caso ho fatto questo:

<div ng-controller="TopNavCtrl">
        <div ng-if="info.host ==='servername'">
            <table class="table">
                <tr ng-repeat="(group, status) in user.groups">
                    <th style="width: 250px">{{ group }}</th>
                    <td><input type="checkbox" ng-model="user.groups[group]" /></td>
                </tr>
            </table>
        </div>
       <div ng-if="info.host ==='otherservername'">
            <table class="table">
                <tr ng-repeat="(group, status) in user.groups">
                    <th style="width: 250px">{{ group }}</th>
                    <td><input type="checkbox" ng-model="user.groups[group]" /></td>
                </tr>
            </table>
        </div>
</div>

4
    <div ng-if="modeldate==''"><span ng-message="required" class="change">Date is required</span> </div>

puoi usare la direttiva ng-if come sopra.


3

Una possibilità per Angular: ho dovuto includere un'istruzione if nella parte html, ho dovuto verificare se tutte le variabili di un URL che produco sono definite. L'ho fatto nel modo seguente e sembra essere un approccio flessibile. Spero che sarà utile per qualcuno.

La parte html nel modello:

    <div  *ngFor="let p of poemsInGrid; let i = index" >
        <a [routerLink]="produceFassungsLink(p[0],p[3])" routerLinkActive="active">
    </div>

E la parte dattiloscritta:

  produceFassungsLink(titel: string, iri: string) {
      if(titel !== undefined && iri !== undefined) {
         return titel.split('/')[0] + '---' + iri.split('raeber/')[1];
      } else {
         return 'Linkinformation has not arrived yet';
      }
  }

Grazie e distinti saluti,

Jan


2
Sembra più angolare che angolareJS.
pzaenger,

@pzaenger, sì, ma molte risposte a questa domanda funzionano per entrambi, quindi penso che alcune persone, come me, guardino comunque le risposte. Per favore fatemi sapere se vi dispiace.
Jan Clemens Stoffregen,

2
Bene. Almeno dovresti menzionarlo nella tua risposta.
pzaenger il

@pzaenger, grazie per questo suggerimento, l'ho menzionato ora.
Jan Clemens Stoffregen,

1

Dichiarazione If else

ng-if="receiptData.cart == undefined ? close(): '' ;"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.