AngularJS将服务名称作为变量传递到状态

AngularJS将服务名称作为变量传递到状态,angularjs,angularjs-ng-repeat,ionic-framework,angular-services,Angularjs,Angularjs Ng Repeat,Ionic Framework,Angular Services,我有各种包含数据和单个状态的服务,从中我解析来自服务的数据以避免多个状态。我的问题是,我不知道如何根据项将服务名称传递/检索到状态。下面是我的示例代码,以了解我的想法: 这是我的单一状态,它用于构造url并解析来自特定服务的数据,问题是我需要找到一种方法在这里传递服务名称,就像:itemId。我知道服务是一个对象,所以我可能无法将它的相对名称(如ID)保存在每个项目中,但解决方案是什么呢?这是我的密码: .state('single', { url: '/:it

我有各种包含数据和单个状态的服务,从中我解析来自服务的数据以避免多个状态。我的问题是,我不知道如何根据项将服务名称传递/检索到状态。下面是我的示例代码,以了解我的想法:

这是我的单一状态,它用于构造url并解析来自特定服务的数据,问题是我需要找到一种方法在这里传递服务名称,就像:itemId。我知道服务是一个对象,所以我可能无法将它的相对名称(如ID)保存在每个项目中,但解决方案是什么呢?这是我的密码:

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