2014-05-16 70 views
1

我有一个自定义的角度指令,用图形表示我的webapp中的一个“活动”。我用这样的:如何将非字符串值传递给Angular指令?

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

有没有什么办法让我获得像这样的非字符串属性?达到此目的的最佳方式是什么?

+1

当你用'@'传递参数时,它总是被视为一个字符串(在你的情况下,它首先被内插)。如果你想要一个表达式的值,你应该使用'='。 [PLNKR](http://plnkr.co/edit/7q5w6bYlwzrC80ht4eGK?p=preview)。 –

+0

@arturgrzesiak非常感谢 - 我还没有意识到我也可以在使用'= ='映射的属性中使用完整表达式(甚至不可分配的表达式)。 –

回答

1

怎么办?

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

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

刚刚尝试 - 它的工作原理。并且具有约束力,所以如果'currentActivity'或'act'会改变,那么'active'内部指令的值也会改变。

+0

非常感谢 - 出于调试目的,我已经在我的模板中将'active'绑定到'',并且(可以理解)抛出一个'noassign'异常当我点击复选框时。我虽然在编译时抛出了这个问题,但已经放弃了这个解决方案。非常感谢! –

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)(); 
} 
+0

其实我在我的代码中有'限制:'E'',但是当我复制粘贴时,在我的问题中意外地忽略了它。你的回答没有解决string-vs-boolean问题。 –

+0

你是对的,但你的上面是一个可行的解决方案,即使你希望有一种不同的方法到达那里。我试图解释不同的方法,你可以在我的更新的答案中引用父指令的范围,希望能够澄清'='和'@'之间的区别 – Brocco

+0

如果我使用'$ parse',虽然它意味着'booleanValue'获胜当模型改变时不会自动更新,对吧?我必须'观看'属性。 –

相关问题