我对您经常在指令中看到的$scope.$eval
很好奇,所以我查看了源代码,并在rootScope.js
中找到了以下内容
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
似乎是由ParseProvider
在parse.js
中定义的,它似乎定义了自己的某种小型语法(该文件有900行长)。
我的问题是:
$eval
到底在做什么?为什么它需要自己的迷你解析语言?eval
?发布于 2013-03-28 07:36:10
$eval
和$parse
不评估JavaScript;他们评估AngularJS expressions。链接的文档解释了expressions和JavaScript之间的区别。
问:$eval到底在做什么?为什么它需要自己的迷你解析语言?
从文档中:
表达式是类似JavaScript的代码片段,通常放在{{
}}这样的绑定中。表达式由$parse服务处理。
它是一种类似JavaScript的迷你语言,它限制了你可以运行的东西(例如,没有控制流语句,除了三元运算符),还增加了一些AngularJS的优点(例如,过滤器)。
Q:为什么不使用普通的旧式javascript "eval“?
因为它实际上并没有计算JavaScript。就像医生说的:
If ...如果你想运行任意的JavaScript代码,你应该让它成为一个控制器方法并调用这个方法。如果要对JavaScript中的角度表达式求值(),请使用$eval()方法。
上面链接的文档中有更多的信息。
发布于 2013-12-16 23:45:02
从测试中看,
it('should allow passing locals to the expression', inject(function($rootScope) {
expect($rootScope.$eval('a+1', {a: 2})).toBe(3);
$rootScope.$eval(function(scope, locals) {
scope.c = locals.b + 4;
}, {b: 3});
expect($rootScope.c).toBe(7);
}));
我们还可以传递求值表达式的局部变量。
发布于 2015-08-27 06:53:01
我认为这里的一个原始问题没有得到回答。我认为没有使用vanilla eval(),因为那样angular应用程序就不会像Chrome应用程序那样工作,因为Chrome应用程序明确禁止出于安全原因使用eval()。
https://stackoverflow.com/questions/15671471
复制相似问题