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-if
、ng-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 中(如果我错了请修复)
或者只是 运行 观察表达式的结果,这要简单得多。
我无法理解 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-if
、ng-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 中(如果我错了请修复)
或者只是 运行 观察表达式的结果,这要简单得多。