Значення за замовчуванням для шаблону Angularjs, якщо прив'язування нуля / невизначено (із фільтром)


180

У мене є прив'язка шаблону, яка відображає атрибут моделі під назвою 'date', який є датою, використовуючи фільтр дати Angular.

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

Все йде нормально. Однак на даний момент, якщо в полі дати немає значення, прив'язка нічого не відображає. Однак я хотів би, щоб він відображав рядок "Різні", якщо немає дати.

Я можу отримати основну логіку за допомогою двійкового оператора:

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

Однак я не можу змусити його працювати з фільтром дат:

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

Як я можу використовувати двійковий оператор поряд з фільтром дати?

Відповіді:


293

Виявляється, все, що мені потрібно було, - загортати ліву частину виразу в м'які дужки:

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

12
Це не працює, якщо вам потрібно відобразити значення "0" у стовпці
neel shah

6
@neelshah Це спрацює, якщо ви зробите щось на кшталт:{{(gallery.date | date:'mediumDate') || "0"}}
Рахіль Вазір

2
Не працює, якщо дата дорівнює нулю, а не визначена, на жаль. Але все-таки хороший трюк. Я боюся, що я повинен зробити спеціальний фільтр для моєї справи.
PhiLho

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

Про всяк випадок, якщо ви хочете спробувати щось інше. Це для мене працювало:

На основі термінального оператора, який має таку структуру:

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

Як результат:

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

1
Відповідь Педра (13 травня 1313 о 13:27, stackoverflow.com/a/16523266/1563880 ) майже однакова, але ваше рішення більш чітке. Howerer, більше листів для написання)
nktssh

1
Це більш інтуїтивно зрозуміло, особливо якщо йде з програми програмування. Тернальні оператори прокладають шлях для простих Ifs Ifs.
asgs

2
вибачте, що натикаєте старий потік, але це рішення, ймовірно, є більш ефективним, ніж прийнята відповідь, оскільки він не викликає фільтр, якщо значення з'явиться помилковим
SnailCoil

Це також корисніше, коли потрібно працювати з більш глибокими ієрархіями.
Навіть Мієн

8

Як я можу використовувати двійковий оператор поряд з фільтром дати?

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

Ви також спробуйте:

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

3

Мені дуже сподобалась ця відповідь, з ngBind ваш текст за замовчуванням може просто жити в тілі елемента, і тоді, якщо ngBind оцінить щось несуттєве / невизначене, ваш вміст заміняється автоматично, і все задоволено

angularjs встановлення значень за замовчуванням, які відображатимуться перед оцінкою


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;
    };
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.