2015-11-09 2 views
0

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

Для этой иллюстрации предположим, что я выделил свою логику инициализации в отдельный метод init().

Насколько я могу сказать, у меня есть три возможных способа вызвать это как часть контроллера запуска:

  • инициализации в конструкторе - В соответствии с предлагаемыми решениями для other questions, вам может вызывать init() от конструктора. Инициализация-в-конструкторе широко используется как анти-шаблон на большинстве языков. Я особенно против этого, потому что у меня есть варианты использования, где у меня есть наследование классов, и не хотел бы, чтобы родительский конструктор вызывал init() (который, возможно, был переопределен в дочернем классе) до того, как дочерний конструктор завершил выполнение.

  • нг-INIT - Invoke init() с помощью нг-init` директиву в представлении. Это не очень удобно, поскольку это связано с моим взглядом на внутреннюю работу моего контроллера.

  • задержка инициализации из конструктора - Используйте $timeout службу, чтобы запланировать вызов init() после задержки 0 миллисекунд. Это позволит полностью завершить выполнение дочернего конструктора до вызова логики инициализации.

Ни одно из этих решений не представляет собой чрезмерно чистый способ решения такой основной проблемы. Есть ли альтернативы, которые я забыл?

ответ

1

Если вы держите разжижает просто: одно состояние и один контроллер за просмотр, , чем это может иметь смысл использовать $stateChangeSuccess событие для инициализации вещи.

$scope.$on('$stateChangeSuccess', 
function(event, toState, toParams, fromState, fromParams){ 
    // transition completed 
    // let's init things 
}) 
Смежные вопросы