【发布时间】:2015-03-11 03:57:13
【问题描述】:
我在answers 和generated some discussion 中提出了这个问题,我想弄清楚我是否偏离了基础,或者是否有一种“更有角度”的方式来实现我的目标。
当我编写一个将使用隔离作用域的指令时,出现的问题总是 =、& 或 @。
通常,人们总是认为 & 是一种将函数传递给指令的方式。 documentation 将其描述为:
一种在上下文中执行表达式的方法 父范围。如果未指定属性名称,则属性名称 假定与本地名称相同。范围的给定和小部件定义:{ localFn:'&myAttr' },则隔离范围属性 localFn 将指向 count = count + value 表达式的函数包装器。经常 最好通过表达式从隔离范围传递数据 到父范围,这可以通过传递本地地图来完成 变量名称和值放入表达式包装器 fn。例如, 如果表达式是增量(数量),那么我们可以指定数量 通过将 localFn 调用为 localFn({amount: 22}) 来获取值。
我用它来传递函数相当多,但我也用它来传递一个返回非字符串的表达式,并且我不希望我的指令能够修改父范围。换句话说,我将其用作:
一种在父作用域的上下文中执行表达式的方法
所以如果我不需要双向绑定,并且表达式不是字符串,我会这样做:
.directive('displayObject', function() {
scope: {
value: '&=displayObject'
},
template: '<div ng-repeat="(k, v) in value()">{{k}}: {{v}}</div>',
replace: true,
...
});
指令的用法是:
<div displayObject="someScopePropertyOrExpression"></div>
= 在这里并不理想,因为我不需要双向绑定。我不希望我的指令修改父范围中的值,也不希望手表需要维护它。
@ 并不理想,因为它会插入属性,因此 value 始终是字符串。
::someScopePropertyOrExpression 不起作用,因为我希望指令模板在 someScopePropertyOrExpression 发生变化时反映它的变化。
在每次讨论中,总是提到
ng-repeat="(key, value) in value()"
设置一个手表-问题是=和模板一起设置了两个-一个是完全没有必要的。
当我多次提出这种模式时,它被称为“hack”,或误用 &,甚至“丑陋”。
我不认为是这些,但如果是,那么我的具体问题是替代方案是什么?
【问题讨论】:
标签: angularjs angularjs-directive