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

时间:2015-03-30 12:30:09

标签: angularjs angularjs-ng-repeat ionic-framework angular-services

我有各种服务,包含数据和单一状态,我从服务中解析数据,以避免多个状态。我的问题是我无法弄清楚如何根据项目将服务名称传递/检索到状态。以下是我的示例代码:

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

 .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')
          }],
       ......

感谢您的任何建议。

2 个答案:

答案 0 :(得分:0)

我决定通过检测网址来实现切换,可能不是最好的解决方案,但它有效。我知道我应该只使用一个服务,并以某种方式将数据数组传递给服务,但不知道如何做到这一点。

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

                }
            }
        }); 

答案 1 :(得分:0)

无论你想要解决什么,你最好找到一个更好的选择。但是你可以通过使用$ injector

来实现这一点
url: '/:serviceName/:itemId'
...
var service = $injector.get($stateParams.serviceName);
service.getItem()....