バインディングがnull /未定義の場合のAngularjsテンプレートのデフォルト値(フィルターあり)


180

Angularの日付フィルターを使用して、日付である「date」というモデル属性を表示するテンプレートバインディングがあります。

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

ここまでは順調ですね。ただし、現時点では、日付フィールドに値がない場合、バインディングは何も表示しません。ただし、日付がない場合は文字列 'Various'を表示したい。

バイナリ演算子を使用して基本的なロジックを取得できます。

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

ただし、日付フィルターを使用することはできません。

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

日付フィルターと一緒に2項演算子を使用するにはどうすればよいですか?

回答:


293

必要なのは、式の左側を角かっこで囲むことだけでした。

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

12
列に「0」値を表示する必要がある場合、これは機能しません
neel shah

6
@neelshahそれはあなたのような何かを行う場合は、作業を行います{{(gallery.date | date:'mediumDate') || "0"}}
Rahil Wazir

2
残念ながら、日付が未定義ではなくゼロの場合は機能しません。しかし、それでも良いトリックです。自分のケース用にカスタムフィルターを作成する必要があるのではないかと心配です。
PhiLho 2015

52

次のフィルターを作成しました。

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

        return input;
    }
});

このように使用するには:

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

本当に素晴らしいアイデアです!少し拡張して複製しましたif (angular.isUndefined(defaultValue) || ... )が、既存のステートメント内にステートメントをネストすると、defStringフィルターを介して文字列 " default" が返されます(他のものはおそらく後で追加されます)。これにより、それをそのまま使用し、最終的なフォールバックレベルとして<span>{{expected.string | defString}}</span>取得できdefaultます。

37

何か他のことを試したい場合に備えて。これは私のために働いたものです:

次の構造を持つ3項演算子に基づいています。

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

結果として:

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

1
Pedrの答え(13年5月13日13:27、stackoverflow.com / a / 16523266/1563880 )はほとんど同じですが、あなたのソリューションはより明確です。ハウアー、書く手紙が
増える

1
これは、特にプログラミングのバックグラウンドから来たときに、より直感的です。三項演算子は、単純なIf else Ifsへの道を開きます。
asgs '29 / 07/29

2
古いスレッドをバンプして申し訳ありませんが、このソリューションも、値がfalseになるとフィルターを呼び出さないため、受け入れられた回答よりもパフォーマンスが高い可能性があります
SnailCoil

これは、より深い階層で作業する必要がある場合にも役立ちます。
Mienでも

8

日付フィルターと一緒に2項演算子を使用するにはどうすればよいですか?

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

あなたも試してみます:

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


0

あなたのcshtmlでは、

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

あなたのJSファイルでは、おそらくapp.js、

app.controllerの外に、以下のフィルターを追加します。

ここで「mydate」は、日付を解析するために呼び出す関数です。ここで「アプリ」は、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;
    };
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.