如何将非字符串值传递给Angular指令?

时间:2014-05-16 13:22:48

标签: javascript angularjs type-conversion angular-directive

我有一个自定义角度指令,以图形方式表示我的webapp中的“活动”。我这样用它:

<activity-box ng-repeat="act in activities"
    model="act" active="{{currentActivity == act}}" />

我的指令有一个独立的范围,并声明modelactive,如下所示:

appDirectives.directive('activityBox', function() {
    return {
        template: '<div ng-class="{activityActive: active == \'true\'}">{{model.name}}</div>',
        restrict: 'E',
        replace: true,
        scope: {
            model: '=',
            active: '@'
        },
        link: ...
    };
});

我不担心model属性,但我的active属性始终被视为字符串。当currentActivity == act为真时,active保存字符串值"true"(而不是布尔值true),或者"false"(而不是false }})。

这意味着虽然它在概念上是一个布尔值,但我必须把它当作一个字符串。例如,我想写ng-class="{activityActive: active}"而不是ng-class="{activityActive: active == 'true'}"。现在,如果我忘记了额外的部分,这总是评估为真,因为"false""true"都是真的。

有没有办法让我获得像这样的非字符串属性?实现这一目标的最佳途径是什么?

2 个答案:

答案 0 :(得分:1)

怎么样?

<activity-box ng-repeat="act in activities"
    model="act" active="currentActivity == act" />

scope: {
            model: '=',
            active: '='
        },

刚试过 - 它有效。并具有约束力,因此如果'currentActivity'或'act'会发生变化,'active'内部指令的值也会发生变化。

答案 1 :(得分:1)

由于代码如上所示,指令与您的代码无关。

默认情况下,指令仅限于属性,并且您尝试将其用作元素。

在你的指令中添加以下行:

replace: true,
restrict: 'E', // <--- This line
scope: {

修改 您可以在定义范围时使用=将其链接到父作用域,从而接受活动标记,但在指令中更改它会在控制器范围内更改它

active="currentActivity == act"
scope: { active: '=' }

但您可以通过字符串接受它并使用$parse服务在控制器中解析它:

active="{{currentActivity == act}}"
scope: { active: '@' }
link: function(scope){
    var booleanValue = $parse(scope.active)();
}