我需要使用指令将布尔值显示为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>
但它不起作用。请帮助我。
答案 0 :(得分:54)
您没有使用合适的工具来完成工作。这应该是一个过滤器:
{{ someBooleanValue | yesNo }}
过滤器就像
一样简单module.filter('yesNo', function() {
return function(input) {
return input ? 'yes' : 'no';
}
});
如果您仍然选择使用指令,则不需要ngModel和格式化程序,这些格式化程序用于必须读取和写入模型的表单字段。您只需要一个模板:
module.directive('yesNo', function() {
return {
template: '<span>{{ yesNo ? "yes" : "no" }}</span>',
scope: {
yesNo: '='
}
};
});
你将它用作
<span yes-no="someBoolean"></span>
答案 1 :(得分:6)
我用...
定义0和1的文本值{{object.PROPERTY?'Yes':'No'}}
...当出现这样的事情时:
{
"PROPERTY": 0
}
结果将是'否'。
答案 2 :(得分:2)
问题出在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
这是一个坏主意,创建一个过滤器应该适合你。