我有大约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
而不是每次写完整列表。
希望很清楚,
谢谢,
答案 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 );