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/