Javascript 如何将非字符串值传递给角度指令?
我有一个自定义角度指令,它以图形方式表示我的webapp中的“活动”。我是这样使用它的: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
<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)();
}