Angularjs - Decorate Controllers

半城伤御伤魂 提交于 2019-11-30 14:51:49

In Angular 1.4.x modules have decorator method, $provide.decorator is no longer needed.

For monkey-patching APIs it is always preferable to use arguments instead of enumerating them explicitly, the chance that it will break is much lesser.

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

Answering my own question.

Had to dig in to Angular source code to figure out whats going on.

The $controller instance is created using below code. The fix lay in the parameter 'later'. This needs to be set to 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.

Above taken from: https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.js

Updated provider code:

angular.module('myApp', ['ng'], function($provide) {
    $provide.decorator('$controller', function($delegate) {

 return function(constructor, locals) {

            //Custom behaviour code

            return $delegate(constructor, locals, true);
        }
    })
});

Updated fiddle: http://jsfiddle.net/v3067u98/1/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!