Являются ли стрелочные функции ES6 несовместимыми с Angular?

Вот обычная функция ES5 в моем коде Angular, которая работает:

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

person laggingreflex    schedule 21.09.2015    source источник
comment
Вы не должны полагаться на имена параметров функции, так как она перестанет работать в тот момент, когда вы минимизируете свой код. Используйте что-то вроде ng-annotate.   -  person Paolo Moretti    schedule 21.09.2015
comment
Единственное отличие состоит в том, что ваша функция что-то возвращает. И синтаксис, конечно.   -  person Bergi    schedule 21.09.2015


Ответы (2)


Правильный. Ваша версия AngularJS несовместима со стрелочными функциями, использующими $инжектор.

В основном это связано с тем, что AngularJS 1.4.6 использует (Function).toString, который не начинается с function( для стрелочных функций, по крайней мере, в Firefox:

>var a = () => 5
function a()
>a.toString()
"() => 5"  // not "function a() {return 5;}"

AngularJS поддерживает стрелочную нотацию, начиная с 1.5.0 и выше.

person Brian    schedule 21.09.2015
comment
Ваши ссылки показывают, что базовая поддержка стрелочных функций существует с версии Angular 1.4.4. (Обратите внимание на тег v1.4.4 в фиксации во второй ссылке.) Я думаю, что фактическая фиксация, связанная с кодом OP, - это commit 03726f7f, который добавил поддержку стрелочных функций с параметром без скобок для Angular 1.5. - person Jeffrey Barnes; 24.03.2016

Я попробовал другой вариант, который сработал: (x)=>… (вместо x=>…)

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

Я думаю, что по какой-то причине нужны скобки

person laggingreflex    schedule 21.09.2015