В видео с нг-Conf 2015 (Angular 1.3 meets Angular 2.0), синтаксис для использования классов ES6 как контроллеры показано как:Назначение зависимостей в контроллерах с использованием класса ES6 синтаксис
class UnicornHype {
constructor(unicornHorn, $q) {
this.$q = $q;
this.horn = unicornHorn
}
findUnicorn {
return this.$q((resolve, reject) => {
...
this.horn.thrust();
...
});
}
}
Я вижу, что инъецированные зависимостей назначенные как свойства экземпляра, и мне интересно, если это хороший способ сделать это. Поскольку зависимости контроллера обычно представляют собой одноэлементные службы, не должны ли они использоваться экземплярами?
Причина, по которой они это сделали, заключается в том, что методы, ранее существовавшие на $scope
(и, следовательно, в теле функции конструктора), теперь находятся в общем прототипе объекта. John Papa's style guide фактически назначает их непосредственно this
(хотя он не использует классы ES6 - но это не имеет особого значения, поскольку они всего лишь синтаксический сахар для функции конструктора prototype
). Это хорошая идея?
Другим подходом было бы поддерживать методы прототипа, но назначать зависимости локальным переменным (при условии, что каждый контроллер находится в собственном файле модуля). Что-то вроде:
var q, horn;
class UnicornHype {
constructor(unicornHorn, $q) {
[q, horn] = [$q, unicornHorn];
}
findUnicorn {
return q(...);
}
}
Это лучше? Если да, то будет const
действительно лучше, чем var
здесь? Имеет ли этот подход какие-либо недостатки?
Третий способ (с использованием WeakMaps
) описан здесь: Writing AngularJS Apps Using ES6. Должен ли я забыть все, что я сказал выше, и сделать это так?
Да, именно это я и думал об услугах в WeakMaps. Что касается подхода с переменной экземпляра, если вы используете синтаксис 'controllerAs', не будет ли это раскрывать все ваши сервисы для представления? – spinningarrow
@spinningarrow Да, ты прав, не думал об этом. Я думаю, вы ответили на свой вопрос. – Icid
@spinningarrow, и я ненавидел это назначать каждую зависимость от контроллера, потому что он нарушает ограничение объема как можно меньше. –