AngularJS将服务名称作为变量传递到状态
我有各种包含数据和单个状态的服务,从中我解析来自服务的数据以避免多个状态。我的问题是,我不知道如何根据项将服务名称传递/检索到状态。下面是我的示例代码,以了解我的想法: 这是我的单一状态,它用于构造url并解析来自特定服务的数据,问题是我需要找到一种方法在这里传递服务名称,就像:itemId。我知道服务是一个对象,所以我可能无法将它的相对名称(如ID)保存在每个项目中,但解决方案是什么呢?这是我的密码:AngularJS将服务名称作为变量传递到状态,angularjs,angularjs-ng-repeat,ionic-framework,angular-services,Angularjs,Angularjs Ng Repeat,Ionic Framework,Angular Services,我有各种包含数据和单个状态的服务,从中我解析来自服务的数据以避免多个状态。我的问题是,我不知道如何根据项将服务名称传递/检索到状态。下面是我的示例代码,以了解我的想法: 这是我的单一状态,它用于构造url并解析来自特定服务的数据,问题是我需要找到一种方法在这里传递服务名称,就像:itemId。我知道服务是一个对象,所以我可能无法将它的相对名称(如ID)保存在每个项目中,但解决方案是什么呢?这是我的密码: .state('single', { url: '/:it
.state('single', {
url: '/:itemUrl/:itemId',
templateUrl: 'templates/single.html',
controller:'singleCtrl',
resolve: {
item: function($stateParams, data1Service) {
return data1Service.getItem($stateParams.itemId);
}
}
});
以下是我保存数据的各种服务:
app.service('data1Service', function($q, $rootScope, $filter, $translate) {
$translate = $filter('translate');
return {
items: [{
id: '1',
title:$translate('TITLE'),
lang:$translate('LANG'),
price:$translate('PRICE'),
serviceName: 'data1Service' //I thought maybe I could save service name like that and then retrieve it somehow without loosing data reference.
}],
getItems: function() {
return this.items;
},
getItem: function(itemId) {
var dfd = $q.defer();
this.items.forEach(function(item) {
if (item.id === itemId) dfd.resolve(item);
});
return dfd.promise;
}
};
});
另一个,等等:
app.service('data2Service', function($q, $rootScope, $filter, $translate) {
$translate = $filter('translate');
return {
items: [{
id: '1',
title:$translate('TITLE'),
lang:$translate('LANG'),
price:$translate('PRICE')
}],
......
谢谢你的建议。我决定通过检测url来实现一个切换,这可能不是最好的解决方案,但它可以工作。我知道我应该只使用一个服务,并以某种方式将数据数组传递到服务中,但不知道如何做到这一点
.state('single', {
url: '/:itemUrl/:itemId',
templateUrl: 'templates/single.html',
controller:'singleCtrl',
resolve: {
item: function($stateParams, data1Service, data2Service) {
switch($stateParams.itemUrl){
case 'val1':
return data1Service.getItem($stateParams.itemId);
break;
case 'val2':
return data2Service.getItem($stateParams.itemId);
break;
}
}
}
});
无论你想解决什么问题,你最好找到一个更好的选择。但是,您可以通过使用$injector来实现这一点
url: '/:serviceName/:itemId'
...
var service = $injector.get($stateParams.serviceName);
service.getItem()....
您可以使用$injector通过名称获取服务:var data1Service=$injector.get('data1Service');但问题是-你将如何处理这项服务?如果你有5个方法完全相同的服务-可能最好使用附加参数创建1个服务。只解决控制器上的工作@PetrAveryanov您是绝对正确的,服务内部唯一改变的是一组数据项,但我找不到如何将参数传递到服务中,所以我只是开始复制服务。如果我没弄错的话,您建议保留一个服务并在其中传递数组,但不确定如何使用.app.service('cumulativeService',function(data1Service,data2Service){return{'val1':data1Service,'val2':data2Service}});