Преобразование логического значения в yes/no дирекцией angular

Мне нужно показать логическое значение yes/no с помощью директивы. Моя директива приведена ниже

 directives.directive('niBooltoYesno',
        function () {
            return {
                restrict: 'EA',
                require: 'ngModel',
                link: function (scope, element, attrs, ngModel) {
                    function formatter(value) {
                        if (value) {
                            return value === true ? 'Yes' : 'No';
                        } else {
                            return '';
                        }
                    }
                    ngModel.$formatters.push(formatter);

                }
            };
        });

<ni-boolto-yesno data-ng-model="set_unit.isActive" ></ni-boolto-yesno>

Но это не сработает. Пожалуйста, помогите мне в этом вопросе.

Ответ 1

Вы не используете правильный инструмент для работы. Это должен быть фильтр:

{{ someBooleanValue | yesNo }}

Фильтр будет таким же простым, как

module.filter('yesNo', function() {
    return function(input) {
        return input ? 'yes' : 'no';
    }
});

Если вы все еще хотите использовать директиву, вам не нужны ngModel и formatters, которые используются в полях формы, которые должны читать и записывать в модель. Все, что вам нужно, это шаблон:

module.directive('yesNo', function() {
    return {
        template: '<span>{{ yesNo ? "yes" : "no" }}</span>',
        scope: {
            yesNo: '='
        }
    };
});

и вы будете использовать его как

<span yes-no="someBoolean"></span>

Ответ 2

Я определяю текстовые значения для 0 и 1 с...

{{object.PROPERTY?'Yes':'No'}}

... когда представлено что-то вроде этого:

{
  "PROPERTY": 0
}

Тогда результат будет "Нет".

Ответ 3

Проблема в if (value). Это заставляет строку return value === true ? ... обрабатываться только тогда, когда значение действительно правдивое (т.е. Никогда не для false). Вам просто нужно правильно создать условия:

function formatter (value) {
    return (value === true) ? 'Yes' : ((value === false) ? 'No' : '');
}

Версия с лучшей читабельностью:

function formatter (value) {
    if (value === true) {
        return 'Yes';
    } else if (value === false) {
        return 'No';
    } else {
        return '';
    }
}

Изменить: я не смотрел ваш HTML. Как следует из другого ответа, использование ng-model для этого - плохая идея, создание фильтра должно подойдет вам просто отлично.