ES6箭头函数与Angular不兼容吗?

13

这是我 Angular 代码中的一个普通的 ES5 函数,它是有效的:

app.run(function($templateCache){ $templateCache.put('/some','thing') });

我希望将它转换为ES6箭头函数。

app.run($templateCache => $templateCache.put('/some','thing'));

但是它会报错。

Uncaught Error: [$injector:unpr] Unknown provider: '/some'Provider <- '/some'
http://errors.angularjs.org/1.4.6/$injector/unpr?p0='%2Fsome'Provider%20%3C-%20'%2Fsome'
REGEX_STRING_REGEXP  @ angular.js:68
(anonymous function) @ angular.js:4287
getService           @ angular.js:4435
(anonymous function) @ angular.js:4292
getService           @ angular.js:4435
invoke               @ angular.js:4467
(anonymous function) @ angular.js:4297
forEach              @ angular.js:336
createInjector       @ angular.js:4297
doBootstrap          @ angular.js:1657
bootstrap            @ angular.js:1678
angularInit          @ angular.js:1572
(anonymous function) @ angular.js:28821
trigger              @ angular.js:3022
eventHandler         @ angular.js:3296

ES6箭头函数与Angular不兼容吗?


编辑:我认为可能是Angular无法推断名称为$templateCache,因此无法注入它,但是我将其记录到控制台上,它确实正确显示:

app.run($templateCache=>console.log($templateCache));
// => 
//  Object {}
//      destroy: function()
//      get: function(key)
//      info: function()
//      put: function(key, value)
//      remove: function(key)
//      removeAll: function()
//      __proto__: Object

不应该依赖于函数参数的名称,因为一旦压缩代码,它就会停止工作。使用类似 ng-annotate 的东西。 - Paolo Moretti
唯一的区别似乎是你的函数确实返回了一些东西。当然,语法也不同。 - Bergi
2个回答

9

你的链接显示,自Angular 1.4.4以来,对箭头函数的基本支持已经存在。(请注意第二个链接中提交的v1.4.4标签。)我认为与OP代码相关的实际提交是commit 03726f7f,它添加了对Angular 1.5中未加括号参数的箭头函数的支持。 - Jeffrey Barnes

3

我尝试了另一种变化,它起作用了:(x)=>…(而不是x=>…

app.run(($templateCache) => $templateCache.put('/some','thing'));

我猜这个原因需要加上括号


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接