通过angular指令将布尔值转换为yes / no

时间:2014-11-23 10:08:09

标签: angularjs

我需要使用指令将布尔值显示为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>

但它不起作用。请帮助我。

3 个答案:

答案 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这是一个坏主意,创建一个过滤器应该适合你。