Angularjs - 装饰控制器
Angularjs - Decorate Controllers
我正在尝试为我的控制器设置装饰器。我的目的是在我的应用程序中的所有控制器中引入一些通用行为。
我已将它配置为在 Angular 1.2.x 中工作,但是从 1.3.x 开始有一些破坏性的更改破坏了代码。现在得到的错误是 "controller is not a function".
装饰器代码如下:
angular.module('myApp', ['ng'], function($provide) {
$provide.decorator('$controller', function($delegate) {
return function(constructor, locals) {
//Custom behaviour code
return $delegate(constructor, locals);
}
})
});
Angular 1.2.x - http://jsfiddle.net/3v17w364/2/(工作中)
Angular 1.4.x - http://jsfiddle.net/tncquyxo/2/(损坏)
回答我自己的问题。
必须深入研究 Angular 源代码才能弄清楚发生了什么。
$controller 实例是使用以下代码创建的。修复位于参数“later”中。这个需要设置为true.
return function(expression, locals, later, ident) {
// PRIVATE API:
// param `later` --- indicates that the controller's constructor is invoked at a later time.
// If true, $controller will allocate the object with the correct
// prototype chain, but will not invoke the controller until a returned
// callback is invoked.
以上摘自:https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.js
更新的提供商代码:
angular.module('myApp', ['ng'], function($provide) {
$provide.decorator('$controller', function($delegate) {
return function(constructor, locals) {
//Custom behaviour code
return $delegate(constructor, locals, true);
}
})
});
已更新 fiddle:http://jsfiddle.net/v3067u98/1/
在Angular 1.4.x模块中有decorator方法,不再需要$provide.decorator
。
对于猴子补丁 API,最好使用 arguments
而不是显式枚举它们,它崩溃的可能性要小得多。
angular.module('myApp', ['ng']).decorator('$controller', function ($delegate) {
return function (constructor, locals) {
var controller = $delegate.apply(null, arguments);
return angular.extend(function () {
locals.$scope.common = ...;
return controller();
}, controller);
};
});
我正在尝试为我的控制器设置装饰器。我的目的是在我的应用程序中的所有控制器中引入一些通用行为。
我已将它配置为在 Angular 1.2.x 中工作,但是从 1.3.x 开始有一些破坏性的更改破坏了代码。现在得到的错误是 "controller is not a function".
装饰器代码如下:
angular.module('myApp', ['ng'], function($provide) {
$provide.decorator('$controller', function($delegate) {
return function(constructor, locals) {
//Custom behaviour code
return $delegate(constructor, locals);
}
})
});
Angular 1.2.x - http://jsfiddle.net/3v17w364/2/(工作中)
Angular 1.4.x - http://jsfiddle.net/tncquyxo/2/(损坏)
回答我自己的问题。
必须深入研究 Angular 源代码才能弄清楚发生了什么。
$controller 实例是使用以下代码创建的。修复位于参数“later”中。这个需要设置为true.
return function(expression, locals, later, ident) {
// PRIVATE API:
// param `later` --- indicates that the controller's constructor is invoked at a later time.
// If true, $controller will allocate the object with the correct
// prototype chain, but will not invoke the controller until a returned
// callback is invoked.
以上摘自:https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.js
更新的提供商代码:
angular.module('myApp', ['ng'], function($provide) {
$provide.decorator('$controller', function($delegate) {
return function(constructor, locals) {
//Custom behaviour code
return $delegate(constructor, locals, true);
}
})
});
已更新 fiddle:http://jsfiddle.net/v3067u98/1/
在Angular 1.4.x模块中有decorator方法,不再需要$provide.decorator
。
对于猴子补丁 API,最好使用 arguments
而不是显式枚举它们,它崩溃的可能性要小得多。
angular.module('myApp', ['ng']).decorator('$controller', function ($delegate) {
return function (constructor, locals) {
var controller = $delegate.apply(null, arguments);
return angular.extend(function () {
locals.$scope.common = ...;
return controller();
}, controller);
};
});