2015-11-04 41 views
2

我很难理解angularjs如何决定如何评估属性。对于为例,使用ng-repeatAngularjs属性文字值与表达式评估

<div ng-repeat="item in items"></div> 

item in items部分将作为表达进行评估,寻找items阵列中的控制器的某处设定的内容。

但使用ng-src

<img ng-src="/path/to/img/"></img> 

path/to/img/将被视为一个文字。如果我要让它“动态”我必须写:

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

其中id在控制器设置。

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

+0

阅读文档有助于 – charlietfl

回答

1

没有什么可供选择的。属性值中的表达式由$interpolate服务插值。后者使用$parse服务来评估字符串中的每个表达式。

某些指令(ng-if,ng-hide)除了表达属性外,通常在API文档中指定。在这种情况下,括号可以省略,表达式将在指令 - $scope.$watch is being used often内进行评估,而不是明确地调用$interpolate

ng-repeat属性语法(它在文档中被称为'repeat expression')由the directive itself解析并且与Angular表达式无关。

0

将表达式定义为你的属性将给你在指令链中的巨大可能性 - 你将逃避孤立范围的错误,这使得我们所有人都疯狂。一个特别链接ng-repeat或其他默认的。

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

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

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

只有con e $ eval才是它对静态变量很好。对于动态,您需要已经评估过的值或最好的方法是将它放入可以在指令之间共享的ng-model(修复我,如果我错了)

或者只运行watcher表达式的结果要简单得多。

+0

为什么如此不利D: – Appeiron

+0

您可以自由检查引导模板js中的任何模板。如果人们经常使用这种方法,并且他们正在使用这种没有副作用的方法,那么这可能是一个很好的解决方案。 – Appeiron