我很难理解angularjs是如何决定如何评估属性的。例如,使用ng-repeat
:
<div ng-repeat="item in items"></div>
item in items
部分将被评估为一个表达式,以查找控制器中某处设置的items
数组的内容。
但使用ng-src
:
<img ng-src="/path/to/img/"></img>
CCD_ 5将被认为是文字。如果我想让它"动态",我必须写:
<img ng-src="/path/to/img/{{id}}"></img>
其中CCD_ 6被设置在控制器中。
问题:在为自定义指令定义自定义属性时,如何选择要遵循的行为?
没有什么可供选择的。属性值中的表达式由$interpolate
服务进行插值。后者使用$parse服务来计算字符串中的每个表达式。
某些指令(ng-if
、ng-hide
)只期望属性中的表达式,该属性通常在API文档中指定。在这种情况下,可以省略括号,并且表达式将在指令中求值-经常使用$scope.$watch
,而不是显式调用$interpolate
。
ng-repeat
属性语法(在文档中称为"重复表达式")由指令本身解析,与Angular表达式无关。
将属性定义为表达式将在指令链中为您提供巨大的可能性-您将逃脱使我们都掉队的隔离范围错误。一个特殊的带有ng个重复或另一个默认值的链。
我在引导程序代码中看到的内容并开始在自己的范围内使用-I$eval表达式,然后将其传递给指令局部变量,而不是在隔离范围内定义。
<div custom some-val='ctrl.data'></div>
//directive link or controller
var private = $scope.$eval($attrs.someVar);
$eval的唯一缺点是它适用于静态变量。对于动态,您需要已经评估过的值,或者最好的方法是将其放入可以在指令之间共享的ng模型中(如果我错了,请修复我)
或者只是对表达式的结果运行观察程序,这要简单得多。