1

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

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

我的指令有一个独立的范围并声明model如下active

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"真实的。

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

4

2 回答 2

1

关于什么?

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

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

刚刚尝试过 - 它有效。并且具有绑定,因此如果“currentActivity”或“act”发生变化,则指令内部“active”的值也会发生变化。

于 2014-05-16T13:40:53.580 回答
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)();
}
于 2014-05-16T13:48:07.180 回答