2015-03-25 1 views
3

В видео с нг-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. Должен ли я забыть все, что я сказал выше, и сделать это так?

ответ

0

Я действительно не понимаю, почему они используют Weakmaps. Цитирую:

Причина выбора WeakMap есть записи о WeakMap, которые имеют объекты, как ключи удаляются после того, как объект мусора.

Но разве услуги не долговечны? Итак, зачем вам нужно собирать мусор?

В javascript все непримитивы являются указателями на исходный экземпляр, поэтому зависимости всегда разделяются. Итак, почему подход с переменной экземпляра не будет хорошей идеей?

В любом случае, я думаю, что подход с переменной переменной экземпляра кажется самым надежным в будущем способом.

+0

Да, именно это я и думал об услугах в WeakMaps. Что касается подхода с переменной экземпляра, если вы используете синтаксис 'controllerAs', не будет ли это раскрывать все ваши сервисы для представления? – spinningarrow

+0

@spinningarrow Да, ты прав, не думал об этом. Я думаю, вы ответили на свой вопрос. – Icid

+2

@spinningarrow, и я ненавидел это назначать каждую зависимость от контроллера, потому что он нарушает ограничение объема как можно меньше. –