Angularjs 属性文字值与表达式求值

Angularjs attribute literal value vs. expression evaluation

我无法理解 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/ 将被视为文字。如果我想做到 'dynamic' 我必须写:

<img ng-src="/path/to/img/{{id}}"></img>

其中 id 在控制器中设置。

问题:在为自定义指令定义自定义属性时如何选择要遵循的行为?

没有什么可以选择的。属性值中的表达式由 $interpolate service. And the latter uses $parse 服务插入以评估字符串中的每个表达式。

一些指令(ng-ifng-hide)只需要属性中的表达式,通常在 API 文档中指定。在这种情况下,括号可以省略,表达式将在指令 - $scope.$watch is being used often 中计算,而不是显式调用 $interpolate

ng-repeat 属性语法(称为 'repeat expression' in documentation) is parsed by the directive itself 并且与 Angular 表达式无关。

将您的属性定义为表达式将为您在指令链中提供巨大的可能性 - 您将避免让我们都陷入困境的隔离范围错误。 A 特别链接 ng-repeat 或其他默认链接。

我在 bootstrap 代码中看到并开始使用的内容 - 我在自己范围内的 $eval 表达式然后传递给指令局部变量而不是在隔离范围内定义。

<div custom some-val='ctrl.data'></div>

//directive link or controller
var private = $scope.$eval($attrs.someVar);

$eval 的唯一缺点是它适用于静态变量。对于动态,您需要已经评估过的值,或者最好的方法是将其放入可以在指令之间共享的 ng-model 中(如果我错了请修复)

或者只是 运行 观察表达式的结果,这要简单得多。