Bağlama Boş / Tanımsızsa Angularjs Şablonu Varsayılan Değeri (Filtreli)


180

Angular'ın tarih filtresini kullanarak bir tarih olan 'tarih' adlı bir model özniteliği görüntüler bir şablon bağlama var.

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

Çok uzak çok iyi. Ancak şu anda, tarih alanında değer yoksa, ciltleme hiçbir şey görüntülemez. Ancak, tarih yoksa 'Çeşitli' dizesini görüntülemek istiyorum.

Ben bir ikili operatör kullanarak temel mantık alabilirsiniz:

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

Ancak ben tarih filtresi ile çalışmak için alınamıyor:

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

Tarih filtresinin yanında ikili işleci nasıl kullanabilirim?

Yanıtlar:


293

Yapmam gereken tek şey ifadenin sol tarafını yumuşak parantez içinde sarmaktı:

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

12
Sütunda '0' değerini görüntülemeniz gerekiyorsa bu işe yaramaz
neel shah

6
@neelshah Şöyle bir şey yaparsanız çalışır:{{(gallery.date | date:'mediumDate') || "0"}}
Rahil Wazir

2
Ne yazık ki tarih tanımsız yerine tarih sıfırsa çalışmaz. Yine de iyi bir numara. Korkarım davam için özel bir filtre yapmak zorundayım.
PhiLho

52

Aşağıdaki filtreyi yaptım:

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

        return input;
    }
});

Bu şekilde kullanılacak:

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

Gerçekten harika bir fikir! Ben biraz genişletilmiş ve çoğaltılmış olsa da: filtre " " (diğerleri muhtemelen daha sonra gelecek) dize döndürür if (angular.isUndefined(defaultValue) || ... )mevcut olanın içinde bir ifade iç içe geçirme . Bu, onu kullanmamı ve son geri dönüş seviyesi olarak almamı sağlıyor . defStringdefault<span>{{expected.string | defString}}</span>default

37

Başka bir şey denemek istemeniz durumunda. Benim için işe yarayan buydu:

Aşağıdaki yapıya sahip Üçlü Operatör temel alınmıştır:

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

Sonuç olarak:

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

1
Pedr'in yanıtı (13 Mayıs 13:27, stackoverflow.com/a/16523266/1563880 ) neredeyse aynıdır, ancak çözümünüz daha açıktır. Howerer, yazmak için daha fazla harf)
nktssh

1
Bu, özellikle programlama arka planından geldiğinde daha sezgiseldir. Üçlü operatörler basit Ifs için yol açtı.
asgs

2
Eski bir iş parçacığını çıkardığım için üzgünüm, ancak bu çözüm de kabul edilen yanıttan daha fazla performans gösteriyor, çünkü değer yanlış
çıkacaksa filtreyi çağırmıyor

Bu, daha derin hiyerarşilerle çalışmanız gerektiğinde daha kullanışlıdır.
Hatta Mien

8

Tarih filtresinin yanında ikili işleci nasıl kullanabilirim?

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

ayrıca şunu da deneyin:

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


0

Cshtml'nizde,

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

JS Dosyanızda, belki app.js,

App.controller'ın dışına aşağıdaki filtreyi ekleyin.

Burada "tarih", tarihi ayrıştırmak için çağırdığınız işlevdir. Burada "app", angular.module dosyasını içeren değişkendir.

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;
    };
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.