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 :(得分:1)
如您所知,AngularJS在bootstrap期间有两个不同的阶段:
模块是配置和运行块的集合 在引导过程中应用于应用程序。在其中 最简单的形式模块由两种集合组成 块:
- 配置块 - 在提供商注册和配置阶段执行。只有提供者和常量 可以注入配置块。这是为了防止 在服务完全之前意外实例化服务 配置。
- 运行块 - 在创建注入器后执行并用于启动应用程序。只有实例和常量才可以 注入运行块。 这是为了防止进一步的系统 在应用程序运行时配置。
醇>
在上面的引文中,我突出显示了关于运行块的句子:
这是为了防止在应用程序运行期间进一步进行系统配置 时间
现在,在AngularJS documentation about decorator:
与
$provide.decorator
一样,module.decorator
函数会运行 在应用程序的配置阶段。这意味着你可以定义一个 在定义装饰服务之前的module.decorator。
因此,控制器(或服务或过滤器)的装饰在配置阶段中完成,而不是在运行阶段中完成。
出于这个原因你的"异步注册一个装饰者"示例不起作用:您正在尝试在initCtrl
函数内定义和修饰控制器。但后者在运行阶段中调用,在此阶段定义新装饰器为时已晚。