如何在Angular中解决控制器多参数形式?

时间:2014-05-30 08:50:38

标签: angularjs

我有大约10个控制器和20个服务。

每个控制器使用至少5个相同的服务和模块。例如:

app.controller('GroupsCtrl', function(
        $rootScope,
        $scope,
        service1,
        service2,
        service3,
        service4,
        service5,
        service6,
         ...
         service20

                )
        { /**/}

看起来非常丑陋和混乱。

Angular是否提供解决多参数问题的解决方案?例如新表格:

app.controller('GroupsCtrl', function(
            $rootScope,
            $scope,
            SomeObject, // goes here that contains other absent services

            service6,
             ...
             service20

                    )
            { /**/}

SomeObject将安装缺席服务:

   SomeObject:[
         service1,
        service2,
        service3,
        service4,
        service5,
        ]

所以在那之后我的所有10个控制器都可以继承SomeObject而不是每次写完整列表。

希望很清楚,

谢谢,

2 个答案:

答案 0 :(得分:2)

是的,你可以。创建一个返回所需服务的工厂,并在控制器中使用该工厂来访问服务。 实施例

var myapp = angular.module('myapp', []);
myapp.service('service1', function() {
    this.test = function(){
        console.log("Inside service1 -->test");
        //alert("Inside service1 -->test")
    }

});
myapp.service('service2', function() {
    this.test = function(){
        console.log("Inside service2 -->test");
        //alert("Inside service2 -->test");
    }

});
myapp.factory('servicesFactory', function(service1,service2) {
    return {
        service1 : service1,
        service2 : service2        
        };

});


myapp.controller('Ctrl', function ($scope,servicesFactory) {
    servicesFactory.service1.test();
    servicesFactory.service2.test();

});

答案 1 :(得分:0)

一个简单的解决方案是使用$ inject属性注释来注入服务名称数组,并使用arguments数组引用服务,如下所示。

//Common services array
var commonServices = ['$scope','$http'];
function initiateCtl(services){
    this.scope = services[0]; this.http = services[1]; 
}

//Controller 1
var sampleCtrl = function(){
    initiateCtl(arguments);
    var $window = arguments[2];
    console.log(scope);    
};
sampleCtrl['$inject'] = commonServices.concat(['$window']);
app.controller('sampleCtrl', sampleCtrl);

//Controller 2
var sampleCtrl2 = function(){
    initiateCtl(arguments);
    var $location= arguments[2];
    console.log(scope);    
};
sampleCtrl2['$inject'] = commonServices.concat(['$location']);
app.controller('sampleCtrl2', sampleCtrl2 );