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.