Angular:为什么延迟加载装饰器不起作用?

时间:2016-11-18 13:51:48

标签: javascript angularjs lazy-loading decorator

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);

为什么第二个例子不起作用?

1 个答案:

答案 0 :(得分:1)

如您所知,AngularJS在bootstrap期间有两个不同的阶段:

  1. 配置阶段
  2. 运行阶段
  3. 来自official documentation

      

    模块是配置运行块的集合   在引导过程中应用于应用程序。在其中   最简单的形式模块由两种集合组成   块:

         
        
    1. 配置块 - 在提供商注册和配置阶段执行。只有提供者和常量   可以注入配置块。这是为了防止   在服务完全之前意外实例化服务   配置。
    2.   
    3. 运行块 - 在创建注入器后执行并用于启动应用程序。只有实例和常量才可以   注入运行块。 这是为了防止进一步的系统   在应用程序运行时配置
    4.   

    在上面的引文中,我突出显示了关于运行块的句子:

      

    这是为了防止在应用程序运行期间进一步进行系统配置   时间

    现在,在AngularJS documentation about decorator

      

    $provide.decorator一样,module.decorator函数会运行   在应用程序的配置阶段。这意味着你可以定义一个   在定义装饰服务之前的module.decorator。

    因此,控制器(或服务或过滤器)的装饰在配置阶段中完成,而不是在运行阶段中完成。

    出于这个原因你的"异步注册一个装饰者"示例不起作用:您正在尝试在initCtrl函数内定义和修饰控制器。但后者在运行阶段中调用,在此阶段定义新装饰器为时已晚。