2013-02-09 53 views
2

我正在包裝我的$資源請求在一個簡單的包裝。主要想法 是能夠在做出請求之前添加一些邏輯。我遵循Nils寫的好文章。

在這裏您可以看到訪問REST API模塊的服務定義。

resources.factory('Device', ['RequestWrapper', '$resource', 'lelylan.config', function(RequestWrapper, $http, config) { 
    var resource = $resource(config.endpoint + '/devices/:id', { id: '@id' }); 
    return RequestWrapper.wrap(resource, ['get', 'query', 'save', 'delete']); 
}]); 

在這裏你可以看到請求包裝定義。

resources.factory('RequestWrapper', ['AccessToken', function(AccessToken) { 
    var requestWrapper = {}; 
    var token; 

    requestWrapper.wrap = function(resource, actions) { 
    token = AccessToken.initialize(); 

    var wrappedResource = resource; 
    for (var i=0; i < actions.length; i++) { request(wrappedResource, actions[i]); }; 
    return wrappedResource; 
    }; 

    var request = function(resource, action) { 
    resource['_' + action] = resource[action]; 

    resource[action] = function(param, data, success, error) { 
     (AccessToken.get().access_token) ? setAuthorizationHeader() : deleteAuthorizationHeader() 
     return resource['_' + action](param, data, success, error); 
    }; 
    }; 

    var setAuthorizationHeader = function() { 
    $http.defaults.headers.common['Authorization'] = 'Bearer ' + token.access_token; 
    }; 

    var deleteAuthorizationHeader = function() { 
    delete $http.defaults.headers.common['Authorization'] 
    }; 

    return requestWrapper; 
}]); 

一切工作就好了GET和DELETE方法(即不返回 身體似乎的),但我不能得到$保存工作。會發生什麼情況是,當創建資源的JSON返回時,它不會被添加。我只有在創建 階段時設置的數據。讓我舉個例子。

在這種情況下,我們使用包裝資源。如果我嘗試獲取#updated_at屬性,我不能 看到它。在Chrome檢查器中,我可以看到資源是如何成功創建的。

$scope.device = new Device({ name: 'Angular light', type: 'http://localhost:9000/types/50bf5af4d033a95486000002' }); 
$scope.device.$save(function(){ console.log('Device Wrapped', $scope.device.created_at) }); 
# => undefined 

如果我使用$資源一切工作正常。

// Suppose authorization is already set 
var Resource = $resource('http://localhost\\:9000/devices/:id'); 
$scope.resource = new Resource({ name: 'Angular light', type: 'http://localhost:9000/types/50bf5af4d033a95486000002' }); 
$scope.resource.$save(function(){ console.log('Device Base', $scope.resource.created_at); }); 
# => 2013-02-09T12:26:01Z 

我開始檢查角resource.js代碼,但幾個小時後,我真的無法弄清楚 出來。我無法得到爲什麼正文返回,但在包裝資源中它是不可訪問的。

任何想法或幫助,將不勝感激。謝謝。

回答

2

在深入AngularJS源代碼的過程中,我找到了解決方案。

問題是包裝返回一個函數,而不是一個對象,這是一些問題。解決的辦法是更改以下行中的包裝:

return resource['_' + action](param, data, success, error); 

這一個:

return resource['_' + action].call(this, params, data, success, error); 

爲什麼?快速的答案是因爲在角色資源的源代碼中他們使用它。實際上#call運行發送給調用對象的函數。它通常用於初始化一個對象。 Learn more here