2016-11-18 58 views
0

Synchronously registering a decoratorAngular:为什么延迟加载装饰器不起作用?

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

Angular不支持延迟加载的组件。你可以看看[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角,但是答案似乎是有效的,无论版本。你知道如何(如果可能)我能达到这样的效果吗? –