我很难理解angularjs如何决定如何评估属性。例如,使用ng-repeat
:
<div ng-repeat="item in items"></div>
item in items
部分将被评估为表达式,在控制器中的某处查找items
数组的内容。
但是使用ng-src
:
<img ng-src="/path/to/img/"></img>
path/to/img/
将被视为文字。如果我想让它变得充满活力&#39;我必须写:
<img ng-src="/path/to/img/{{id}}"></img>
在控制器中设置id
。
问题:在为自定义指令定义自定义属性时,如何选择要遵循的行为?
答案 0 :(得分:1)
没有什么可供选择的。属性值中的表达式由$interpolate
服务进行插值。后者使用$parse服务来评估字符串中的每个表达式。
某些指令(ng-if
,ng-hide
)只需要属性中的表达式,通常在API文档中指定。在这种情况下,可以省略括号,并且将在指令 - $scope.$watch
is being used often中评估表达式,而不是显式调用$interpolate
。
ng-repeat
属性语法(在文档中称为'repeat expression')由the directive itself解析,与Angular表达式无关。
答案 1 :(得分:0)
将您的属性定义为表达式将为您提供指令链中的巨大可能性 - 您将逃脱孤立范围错误,这使得我们所有人都陷入困境。特别是具有ng-repeat或其他默认链的链。
我在bootstrap代码中看到并开始使用 - 我自己范围内的I $ eval表达式然后传递给指令局部变量而不是在隔离范围中定义。
<div custom some-val='ctrl.data'></div>
//directive link or controller
var private = $scope.$eval($attrs.someVar);
只有$ eval的con才是静态变量的好处。对于动态,你需要已经评估过的值或最好的方法是将它放入可以在指令之间共享的ng-model中(如果我错了就修好我)
或者只是在表达结果上运行观察者就更简单了。