注入角度服务时运行相同的代码

时间:2016-11-03 13:36:33

标签: javascript angularjs

我希望为注入特定服务的每个函数运行相同的代码行。例如:

app.service('sameInitService', function ($rootScope) {
  this.init = function (scope) {
    scope.foo = $rootScope.foo;
  }
});

app.controller('oneController', function ($scope, sameInitService) {
  sameInitService.init($scope); // <- This line of code
});

app.controller('twoController', function ($scope, sameInitService) {
  sameInitService.init($scope); // <- Is the same
});

是否有一种角度方法可以避免在注入此服务时编写相同的代码行?

2 个答案:

答案 0 :(得分:0)

可以通过装饰$ controller服务来完成,但在这种情况下,所有控制器都将以这种方式初始化。

> tabular(id ~ (description*Heading()*unique)+Heading()*which*(p + padjust + metal + perc + sig)*Heading()*identity, data = test_table)

                                         compress                            
 id         description                  p         padjust   metal perc sig  
 GO:0005525 GTP binding                  6.514e-09 9.063e-07 ca    0    TRUE 
 GO:0005634 nucleus                      1.000e+00 1.000e+00 ca    0    FALSE
 GO:0008270 zinc ion binding             1.000e+00 1.000e+00 ca    0    FALSE
 GO:0019001 guanyl nucleotide binding    2.320e-10 3.919e-08 ca    0    TRUE 
 GO:0046914 transition metal ion binding 1.000e+00 1.000e+00 ca    0    FALSE

 normal                                
 p         padjust   metal perc   sig  
 1.000e+00 1.000e+00 mg    0.8756 FALSE
 4.922e-05 1.663e-02 zn    0.8417 TRUE 
 1.082e-21 8.526e-19 zn    0.8318 TRUE 
 1.000e+00 1.000e+00 mg    0.8767 FALSE
 2.060e-14 1.218e-11 zn    0.5193 TRUE 

请参阅jsfiddle here

答案 1 :(得分:0)

我想扩展@janusz的答案,并提供我实际上最终使用的代码,它只对注入依赖关系的控制器进行&#34;应用行为&#34;:

angular.module('App').decorator('$controller', function ($delegate, sameInitService) {
    return function (constructor, locals) {
        var controller = $delegate.apply(null, arguments);
        return angular.extend(function () {
          var controllerInstance = controller()
          var DIList = controllerInstance .__proto__.constructor.$inject;
          console.log(DIList);
          if (DIList.indexOf('sameInitService') !== -1) {
            sameInitService.init(locals.$scope);
          }
          return controllerInstance;
        }, controller);
    };
});

以下是修改后的fiddle