Преобразование логического значения в 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
для этого - плохая идея, создание фильтра должно подойдет вам просто отлично.