Angularjs 通过角度指令将布尔值转换为是/否

Angularjs 通过角度指令将布尔值转换为是/否,angularjs,Angularjs,我需要使用指令将布尔值显示为yes/no。我的指示如下 directives.directive('niBooltoYesno', function () { return { restrict: 'EA', require: 'ngModel', link: function (scope, element, attrs, ngModel) {

我需要使用指令将布尔值显示为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>
directives.directive('niBooltoYesno',
函数(){
返回{
限制:“EA”,
要求:'ngModel',
链接:功能(范围、元素、属性、模型){
函数格式化程序(值){
如果(值){
返回值===true?'Yes':'No';
}否则{
返回“”;
}
}
ngModel.$formatters.push(格式化程序);
}
};
});

但它不起作用。请在这一点上帮助我。

问题在于
if(value)
。这导致
返回值===true仅当值实际为truthy时才处理的行(即决不用于
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
因为这是一个坏主意,创建一个过滤器应该很适合你。

你没有使用合适的工具来完成这项工作。这应该是一个过滤器:

{{ 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: '='
        }
    };
});
module.directive('yesNo',function(){
返回{
模板:{{yesNo?}是:“{no}}”,
范围:{
是否:'='
}
};
});
你会把它当作

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

我使用

{{object.PROPERTY?'Yes':'No'}}
…当出现这样的情况时:

{
  "PROPERTY": 0
}

结果将是“否”。

您应该准确地描述它是如何工作的,或者提供一个JSFIDLE/codepen。为什么不使用类似于{{user.booleanValue?'yes':“No'}}}的过滤器来解决我的问题呢?这确实是一个更好的答案。它既简单又干净。JB Nizet给出的答案非常好,但在这种情况下,这是一种过分的做法。它适用于更复杂的场合。if语句的嵌套有点不正确(格式化版本)。您没有添加else if块。三元运算符的else块将包含第二个if-elseblock@Kieran
如果A{X}else{if B{Y}else{Z}
相当于
如果A{X}else如果B{Y}else{Z}
而扁平化的代码总是更容易阅读。