2016-02-03 4 views
2

Я обновляю приложение AngularJS, чтобы использовать синтаксис сильной стрелки для анонимных функций. Я знаю, что я need to use version 1.5, но некоторые вещи все еще не работают. Например, вот у меня есть пользовательская директива, которая проходит строку «привета» к его контроллеру, который затем выводит строку как предупреждение:Передача переменных области в контроллер AngularJS с использованием жирных стрелок

<div data-my-directive="hello">Text that will be replaced by my-template</div> 

angular 
    .module('myModule') 
    .directive('myDirective',() => (
      { 
       restrict: 'A', 
       templateUrl: 'my-template', 
       controller: 'myController', 
       controllerAs: 'myCtrl', 
       bindToController: true, 
       scope: {myVariable : '@myDirective'} 
      })) 
    .controller('myController',() => { 
     alert('the scope variable is: ' + this.myVariable); 
    } 

Но это оповещение «переменная область видимости: не определены».

Если я изменю определение контроллера для использования синтаксиса ES5, он предупреждает, что «переменная области видимости: hello», как и ожидалось.

.controller('myController', function() { 
     alert('the scope variable is: ' + this.myVariable); 
    } 

Я думаю, что это что-то делать с binding of this.

Есть ли способ использовать обозначение жирной стрелки при передаче переменных сферы, как указано выше?

+0

Пожалуйста, дайте мне знать, это работает или нет? –

+0

@JMK Второй блок кода (без стрелки жира) - синтаксис ES5 –

+0

Не толстый, просто стрелка. И это не синтаксис «анонимных функций». Функция стрелки - это особый тип функции. 'controller' ожидает функцию конструктора, которая никогда не может быть функцией стрелки. – zeroflagL

ответ

1

В этом случае вы должны использовать функцию вместо() =>.

Если вы:

.controller('myController',() => { 
    console.log(this); // -> window 
}) 

Если вы используете функцию стрелки здесь, это === окно. Контроллер нуждается в реальной возможности для правильной работы. Я уверен, что вы не хотите, чтобы окно было обычным объектом для всех контроллеров в вашем приложении :)

Функция Arrow действительно полезна с классом и обратным вызовом, но не должна использоваться каждый раз.

0

Угловые вызывает функцию контроллера, как это: fn.apply(self, args); , где self (который становится this в вызываемой функции) является объектом, который имеет требуемые поля - т.е. myVariable в примере.

Arrow functions ignore the first of apply's arguments. Так как @Yoann говорит, мы должны использовать function() {...}, а не () => {...}.