Valore predefinito del modello Angularjs se l'associazione è nulla / non definita (con filtro)


180

Ho un modello di associazione che visualizza un attributo modello chiamato 'data' che è una data, usando il filtro data di Angular.

<span class="gallery-date">{{gallery.date | date:'mediumDate'}}</span>

Fin qui tutto bene. Tuttavia, al momento, se non è presente alcun valore nel campo della data, l'associazione non mostra nulla. Tuttavia, vorrei che visualizzasse la stringa "Varie" se non c'è una data.

Posso ottenere la logica di base usando un operatore binario:

<span class="gallery-date">{{gallery.date || 'Various'}}</span>

Tuttavia non riesco a farlo funzionare con il filtro data:

<span class="gallery-date">{{gallery.date | date:'mediumDate' || "Various"}}</span>

Come posso usare l'operatore binario insieme al filtro data?

Risposte:


293

Risulta che tutto ciò che dovevo fare era avvolgere il lato sinistro dell'espressione tra parentesi quadre:

<span class="gallery-date">{{(gallery.date | date:'mediumDate') || "Various"}}</span>

12
Questo non funziona se è necessario visualizzare un valore "0" nella colonna
neel shah,

6
@neelshah Funziona se fai qualcosa del genere:{{(gallery.date | date:'mediumDate') || "0"}}
Rahil Wazir,

2
Non funziona se la data è zero anziché indefinito, ahimè. Comunque è ancora un buon trucco. Temo di dover creare un filtro personalizzato per il mio caso.
PhiLho,

52

Ho creato il seguente filtro:

angular.module('app').filter('ifEmpty', function() {
    return function(input, defaultValue) {
        if (angular.isUndefined(input) || input === null || input === '') {
            return defaultValue;
        }

        return input;
    }
});

Per essere usato in questo modo:

<span>{{aPrice | currency | ifEmpty:'N/A'}}</span>
<span>{{aNum | number:3 | ifEmpty:0}}</span>

Un'idea davvero fantastica! L'ho esteso e duplicato un po 'però: annidando if (angular.isUndefined(defaultValue) || ... )un'istruzione all'interno di quella esistente, attraverso la quale il defStringfiltro restituisce la stringa " default" (altri probabilmente verranno dopo). Questo mi permette di usarlo come <span>{{expected.string | defString}}</span>e ottenere defaultcome livello di fallback finale.

37

Nel caso tu voglia provare qualcos'altro. Questo è ciò che ha funzionato per me:

Basato sull'operatore ternario che ha la seguente struttura:

condition ? value-if-true : value-if-false

Come risultato:

{{gallery.date?(gallery.date | date:'mediumDate'):"Various" }}

1
La risposta di Pedr (13 maggio 13 alle 13:27, stackoverflow.com/a/16523266/1563880 ) è quasi la stessa, ma la tua soluzione è più esplicita. Howerer, altre lettere da scrivere)
nktssh

1
Questo è più intuitivo, soprattutto quando proviene da un background di programmazione. Gli operatori ternari aprono la strada a semplici If else Ifs.
chiede il

2
scusate il bump di un vecchio thread, ma questa soluzione è probabilmente anche più performante della risposta accettata, perché non chiama il filtro se il valore risulterà falso
SnailCoil

Questo è anche più utile quando è necessario lavorare con gerarchie più profonde.
Anche Mien, il

8

Come posso usare l'operatore binario insieme al filtro data?

<span class="gallery-date">{{gallery.date | date:'mediumDate' || "Date Empty"}}</span>

provi anche:

<span class="gallery-date">{{ gallery.date == 'NULL' ? 'mediumDate' : "gallery.date"}}</span>


0

Nel tuo cshtml,

<tr ng-repeat="value in Results">                
 <td>{{value.FileReceivedOn | mydate | date : 'dd-MM-yyyy'}} </td>
</tr>

Nel tuo file JS, forse app.js,

Al di fuori di app.controller, aggiungi il filtro in basso.

Qui "mydate" è la funzione che stai chiamando per analizzare la data. Qui "app" è la variabile che contiene angular.module

app.filter("mydate", function () {
    var re = /\/Date\(([0-9]*)\)\//;
    return function (x) {
        var m = x.match(re);
        if (m) return new Date(parseInt(m[1]));
        else return null;
    };
});
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.