Javascript 如何将非字符串值传递给角度指令?

Javascript 如何将非字符串值传递给角度指令?,javascript,angularjs,type-conversion,angular-directive,Javascript,Angularjs,Type Conversion,Angular Directive,我有一个自定义角度指令,它以图形方式表示我的webapp中的“活动”。我是这样使用它的: <activity-box ng-repeat="act in activities" model="act" active="{{currentActivity == act}}" /> appDirectives.directive('activityBox', function() { return { template: '<div ng-clas

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

<activity-box ng-repeat="act in activities"
    model="act" active="{{currentActivity == act}}" />
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
为true时,则
active
保存字符串值
“true”
(而不是布尔值
true
),否则,
“false”
(而不是
false

这意味着,尽管它在概念上是一个布尔值,但我必须将其视为一个字符串。例如,我想写
ng class=“{activityActive:active}”
而不是
ng class=“{activityActive:active=='true'}”
。现在,如果我忘记了额外的部分,它总是计算为true,因为
“false”
“true”
都是真实的

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

如何

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

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

范围:{
型号:'=',
活动:'='
},

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

由于上面显示的代码,该指令与您的标记不关联

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

在指令中添加以下行:

replace: true,
restrict: 'E', // <--- This line
scope: {
但您可以通过字符串接受它,并使用
$parse
服务在控制器中解析它:

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

当您使用
@
传递参数时,它始终被视为一个字符串(在您的例子中,它是先插入的)。如果需要表达式的值,则应使用
=
。这就证明了这一点。@arturgrzesiak非常感谢-我没有意识到我也可以在映射为
'='
的属性中使用完整表达式(甚至是不可赋值的表达式)。实际上,我的代码中确实有
限制:“E'
,但在复制粘贴时,在我的问题中意外地忽略了它。您的答案没有解决字符串与布尔值的问题。您是正确的,但您上面的解决方案是可行的,即使您希望以不同的方式实现。我在更新的答案中试图解释您可以在指令中引用父范围的不同方式,希望这能澄清
=
@
之间的区别,如果我使用
$parse
,这意味着
布尔值
不会在模型更改时自动更新,对吗?我必须
$watch
该属性。您是正确的,除非您必须使用
&
,这允许您只查看引用控制器的范围。请参见此示例:是的,虽然指令的作用域是控制器作用域的子级,但它会使指令对控制器中的特定实现感到厌倦。这也会影响指令的可测试性。非常感谢-出于调试目的,我已将
active
绑定到模板中的
,这(可以理解)是在我单击复选框时抛出了
noassign
异常。我认为这是在编译时抛出的,并且已经放弃了该解决方案。谢谢!
active="{{currentActivity == act}}"
scope: { active: '@' }
link: function(scope){
    var booleanValue = $parse(scope.active)();
}