Angularjs $ eval并不总是有效

时间:2016-05-06 19:26:06

标签: angularjs

我想知道何时可以安全地使用方法$ eval(在AngularJS $ rootScope.Scope中声明)。 我不能理解这两个例子之间的区别。

example 1中,{{$ eval(expr)}}按预期工作:

<li ng-repeat="expr in exprs track by $index">
  [ <a href="" ng-click="removeExp($index)">X</a> ]
  <code>{{expr}}</code> => {{$eval(expr)}}
</li>

example 2中,{{$ eval(name)}}生成空字符串:

<div ng-controller="ExampleController">
  <label>Enter name: <input type="text" ng-model="name"></label><br>
  Hello {{$eval(name)}}!
</div>

注意:如果你更换&#34; $ eval(name)&#34; by&#34; name&#34;在示例2中,结果将如预期的那样。

3 个答案:

答案 0 :(得分:0)

不确定这是否是原因,但在第一个例子中,ng-repeat为ng-repeat中的范围内的expr创建了一个变量。在第二个例子中,没有任何内容可以明确地将名称保留在范围内,因此,对它的直接评估将会失败。显然当表达式用引号括起来时,$ eval足以在当前范围的上下文中对其进行评估。

无论如何,规则是如果您引用范围内的变量(或其他表达式),则不需要引号。

答案 1 :(得分:0)

在示例2中,您正在评估范围上name属性中的值。给定不是表达式的字符串时,$ eval返回并返回空字符串。如果输入框中的值是'Whirled'而不是Whirled,那么它也能正常工作。

答案 2 :(得分:0)

谢谢你们。 现在我的答案如下。

在示例2中,AngularJS用Whirled替换名称。 作为$ eval的参数,这不是表达式(尽管它看起来像未初始化的字段旋转了一些$ scope),因此$ eval产生空字符串。

下一个问题:如果你使用eval(name)而不是$ eval(name),它也会产生空字符串。 为什么不'未定义'?