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


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

最佳答案

如您所知,AngularJS在引导过程中有两个不同的阶段:


配置阶段
运行阶段


official documentation


  模块是配置和运行块的集合,它们可以
  在引导过程中应用于应用程序。在其
  最简单的形式,该模块由两种类型的集合组成
  块:
  
  
  配置块-在提供者注册和配置阶段执行。仅提供者和常量
  可以注入到配置块中。这是为了防止
  在服务未完全实现之前对其进行意外实例化
  配置。
  运行块-创建注射器后执行,并用于启动应用程序。只有实例和常量可以是
  注入运行块。这是为了防止进一步的系统
  在应用程序运行时进行配置。
  


在上面的引用中,我突出了有关运行块的句子:


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


现在,在AngularJS documentation about decorator中:


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


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

因此,您的“异步注册装饰器”示例不起作用:您正在尝试在initCtrl函数中定义和装饰控制器。但是后者在运行阶段被称为,在该阶段定义新的装饰器为时已晚。

关于javascript - Angular:为什么延迟加载装饰器不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40678798/

10-12 18:20