2016-11-18 6 views
0

Synchronously registering a decoratorУгловая: почему ленивая загрузка декоратора не работает?

angular 
    .module('myApp') 
    .decorator('$controller', MyDecorator); 

angular 
    .module('myApp') 
    .controller('MyCtrl', MyCtrl); 

Asynchronously registering a decorator

$timeout(function() { 
    angular 
    .module('myApp') 
    .register 
    .decorator('$controller', MyDecorator); 

    // Make sure controller is registered after decorator 
    $timeout(function() { 
    angular 
     .module('myApp') 
     .register 
     .controller('MyCtrl', MyCtrl); 
    }, 1000); 
}, 1000); 

Почему не второй пример работы?

+0

Что не работает? Что такое сообщение об ошибке? Что делает 'MyDecorator', где он используется? – Bergi

+0

Угловой не поддерживает ленивые компоненты. Вы можете посмотреть [ocLazyLoad] (https://github.com/ocombe/ocLazyLoad). – zeroflagL

+0

@Bergi Там нет ошибок, он просто не работает –

ответ

1

Как вы знаете, AngularJS имеет 2 различные фазы во время начальной загрузки:

  1. фаза конфигурации
  2. фазы запуска

От official documentation:

Модуль представляет собой набор от конфигурация и запустите блоков, которые получают , применяемые к приложению во время процесса начальной загрузки. В своей простейшей форме модуль состоит из набора двух видов блоков:

  1. конфигурации блоков - получить выполненные во время регистрации поставщика и фазы конфигурации. В конфигурационные блоки могут быть введены только поставщики и константы . Это необходимо для предотвращения случайного экземпляра служб до того, как они были полностью установлены .
  2. Выполнить блоки - выполнить после создания форсунки и использовать для запуска приложения. Только экземпляры и константы могут быть введены в блокировку . Это необходимо для предотвращения дальнейшей конфигурации системы во время выполнения приложения.

В приведенной выше цитате я выделил предложение о прогонов блоков:

Это делается для предотвращения дальнейшей настройки системы во время выполнения прикладной программы времени

Теперь, AngularJS documentation about decorator:

Как с $provide.decorator, функция module.decoratorработает во время фазы конфигурации приложения. Это означает, что вы можете определить модуль module.decorator до того, как будет определен оформленный сервис.

Так украшение контроллера (или службы или фильтра) выполняется в фазе конфигурации не в фазе выполнения.

По этой причине ваш «асинхронно регистрация декоратора» пример не работает: вы пытаетесь определить и украсить контроллер внутри функций initCtrl. Но последнее вызвано в фазе , и уже слишком поздно определять новые декораторы на этом этапе.

+0

я использую угловую 1.5, однако ответ кажется действительным независимо от версии. Вы знаете, как (если возможно) я мог бы достичь такого эффекта? –

Смежные вопросы