2014-02-21 35 views
11

我想用自定义服务中的数据来装饰角度$资源返回的数据。 我的代码是:

angular.module('yoApp') 
    .service('ServerStatus', ['$resource', 'ServerConfig', function($resource, ServerConfig) { 
    var mixinConfig = function(data, ServerConfig) { 
     for (var i = 0; i < data.servers.length; i++) { 
     var cfg = ServerConfig.get({server: data.servers[i].name}); 
     if (cfg) { 
      data.servers[i].cfg = cfg; 
     } 
     } 
     return data; 
    }; 

    return $resource('/service/server/:server', {server: '@server'}, { 
     query: { 
     method: 'GET', 
     isArray: true, 
     transformResponse: function(data, header) { 
      return mixinConfig(angular.fromJson(data), ServerConfig); 
     } 
     }, 
     get: { 
     method: 'GET', 
     isArray: false, 
     transformResponse: function(data, header) { 
      var cfg = ServerConfig.get({server: 'localhost'}); 
      return mixinConfig(angular.fromJson(data), ServerConfig); 
     } 
     } 
    }); 
}]); 

看来我做的关于依赖注入一些错误。从ServerConfig.get()返回的数据被标记为未解析。 我得到了一个控制器,我做的改造与

ServerStatus.get(function(data) {$scope.mixinConfig(data);}); 

这个工作,但我宁愿做在服务的装饰。我该如何做这项工作?

+0

'transformResponse'函数是否被调用?你使用的是什么版本的Angular?你会发现一个简约的例子在这里实现响应装饰:http://jsfiddle.net/YxTNL/1/ –

+0

@LukasBünger感谢您的回复。我想出了一个解决方案,并将其发布到http://jsfiddle.net/maddin/7zgz6/ 我想在transformResponse中实现的是不可能的。我想我写了一个正确的答案... – Maddin

回答

8

无法使用transformResponse装饰来自异步服务的数据的数据。 我发布了解决方案http://jsfiddle.net/maddin/7zgz6/

这里是伪代码解释了解决方案:

angular.module('myApp').service('MyService', function($q, $resource) { 
    var getResult = function() { 
    var fullResult = $q.defer(); 
    $resource('url').get().$promise.then(function(data) { 
     var partialPromises = []; 
     for (var i = 0; i < data.elements.length; i++) { 
     var ires = $q.defer(); 
     partialPromisses.push(ires); 
     $resource('url2').get().$promise.then(function(data2) { 
      //do whatever you want with data 
      ires.resolve(data2); 
     }); 
     $q.all(partialPromisses).then(function() { 
      fullResult.resolve(data); 
     }); 
     return fullResult.promise; // or just fullResult 
     } 
    }); 
    }; 
    return { 
    getResult: getResult 
    }; 
}); 
7

好吧,它实际上可能与transformResponse方法异步但不装饰的数据资源。应该使用interceptor

下面是一个快速示例。

angular.module('app').factory('myResource', function ($resource, $http) { 
    return $resource('api/myresource', {}, { 
    get: { 
     method: 'GET', 
     interceptor: { 
     response: function (response) { 
      var originalData = response.data; 
      return $http({ 
       method: 'GET', 
       url: 'api/otherresource' 
      }) 
      .then(function (response) { 
       //modify the data of myResource with the data from the second request 
       originalData.otherResource = response.data; 
       return originalData; 
      }); 
     } 
     } 
    }); 

您可以使用任何服务/资源,而不是$http

更新:
由于路角的$资源拦截器实现上面的代码将只装点由$承诺,在某种程度上返回的数据打破了一些$资源概念,这尤其如此。

var myObject = myResource.get(myId); 

只有这样才行。

var myObject; 
myResource.get(myId).$promise.then(function (res) { 
    myObject = res; 
}); 
+1

“打破了一些$资源概念”太糟糕了! $资源很糟糕。尽管感谢您提供有用的信息! –

相关问题