我有一个自定义角度指令,以图形方式表示我的webapp中的“活动”。我这样用它:
<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"
都是真的。
有没有办法让我获得像这样的非字符串属性?实现这一目标的最佳途径是什么?
答案 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)();
}