Использовать $componentController в производстве?

Я создаю диалоговый сервис. Диалог может иметь контроллер, очень похожий на $mdDialog, например:

myDialogService.show({
  templateUrl: `<div ng-click="$ctrl.log()">Hello dialog</div>`,
  controller: function() {
    this.log = function() {
      console.log("logged from myDialogController");
    }
  }
});

который прекрасно работает. Я вызываю контроллер таким образом:

locals.$scope = scope;
const invokeController = $controller(options.controller, locals, true);

const controller = invokeController();
if (options.controllerAs) {
  scope[options.controllerAs] = controller;
} else {
  const controllerAs = "$ctrl";
  scope[controllerAs] = controller;
}

В angular-mock есть служба $componentController, которая может вызывать контроллеры компонентов. С моим кодом я могу вызывать только зарегистрированные контроллеры или заданные функции контроллера. Это не очень полезно, так как у меня зарегистрированы только компоненты, а не отдельные контроллеры.

Мой вопрос

Возможно/рекомендуется ли использовать $componentController в рабочей среде? Или есть ли какая-либо сборка AngularJS в варианте, который я наблюдал?


person scipper    schedule 28.11.2017    source источник


Ответы (1)


$componentController принадлежит модулю ngMock, потому что он полезен для тестирования, но считается взломом в производстве. Поскольку ngMock достаточно большой и не должен быть доступен в рабочей среде, его следует вставить, чтобы он стал доступным.

Правильный способ решить эту проблему — либо иметь зарегистрированные контроллеры, которые повторно используются в качестве контроллеров компонентов, либо импортировать/экспортировать функции/классы контроллера с модулями JS.

Поскольку MdDialogController принадлежит стороннему модулю, не регистрируется и не экспортируется, имеет небольшой размер, его можно просто вставить.

person Estus Flask    schedule 28.11.2017
comment
Использование экспортированного контроллера компонента звучит как возможное решение. Поскольку я написал свой код в TS, он уже экспортирован. Я пробую это. Спасибо! - person scipper; 28.11.2017
comment
Это не было ясно из первоначального вопроса, но я думаю, что да, это ответ. Модули Angular и DI частично заменяют функциональность, предоставляемую модулями ES. Повторное использование и наследование контроллеров — это то, что следует делегировать модулям ES, когда они доступны. - person Estus Flask; 28.11.2017