angularjs scope。$ eval意外行为

时间:2014-03-26 09:24:42

标签: javascript angularjs

如果我有一个破折号的属性,请在我的范围内说a-a,其价值为'some value',并尝试评估

scope.$eval('a-a')

它将返回0。我认为它认为连字符是一个减法运算符,但无论如何:有没有办法调用$eval来返回我需要的东西(即'some-value')?

这个小提琴显示了例子:http://jsfiddle.net/BusD7/1/

1 个答案:

答案 0 :(得分:0)

您在这里尝试做的事情存在一些问题。

在你的小提琴中,你有

$scope['a-a'] = 'some value';

第一个问题是'a-a'不是正确的变量名。 JS变量可以有下划线(_),字母数字(a-z,1-9)和美元符号($) 您正在尝试使用连字符( - )创建变量;这在JS中是不允许的。

查看此文档。 JS variable names

其次,在你的jsFiddle中你有

{{$eval('a-a')}}

Angularjs $ eval函数试图弄清楚你提供的表达式'a-a',是的,$ eval函数试图评估 - 运算符。

见这里的例子:

Angularjs Expressions

这就是Angular在您执行此操作时所做的事情

{{ a-a }} which will result in 0 as well.

and {{ 'a-a' }} would just result in a string of a-a

在你的jsFiddle上玩,你会看到它的作用。

要回答您的问题,请执行此操作以使其发挥作用。

 $scope['a-a'] = 'some value';    to this    $scope['a_a'] = 'some value'; 

{{$eval('a-a')}}        to this      {{$eval('a_a')}}

现在您知道变量名称不能有连字符(在JS中),您到底想要完成什么,我会协助您到达那里。

<强>更新

是的,当然,谢谢你的纠正。您正在使用括号表示法创建对象属性。我主要使用点符号(即使使用括号表示法),点符号只允许使用常规变量名。

以下是两种表示法类型的链接

  

对象属性名称可以是任何有效的JavaScript字符串,也可以是可以转换为字符串的任何内容,包括空字符串。但是,任何不是有效JavaScript标识符的属性名称(例如,具有空格或连字符的属性名称,或以数字开头的属性名称)只能使用方括号表示法访问。

并链接Bracket Notation Information

要使用Angularjs解决您的问题,请执行以下操作:

将“a-a”属性名称添加到新对象并附加到$ scope。

like this: $scope.myNewObject = {};
           $scope.myNewObject['a-a'] = 'some value';

Then call it like this:
           {{ myNewObject['a-a'] }}

Will return: some value

这是在jsFiddle

中工作的想法

Working Answer Link