2014-02-21 67 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

「打破了一些$資源概念」太糟糕了! $資源很糟糕。儘管感謝您提供有用的信息! –

相關問題