2013-02-09 2 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을 위해 잘 작동 및 삭제 방법 (몸이 보인다 반환하지 않는 사람을),하지만 작업 저장 $ 얻을 수 없습니다. 어떤 일이 발생하면 의 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 코드를 확인하기 시작했지만 몇 시간 후 난 정말 그것을 알아낼 수 없었다. 본문이 반환되는 이유는 알 수 없지만 래퍼 리소스에서는 액세스 할 수 없습니다.

어떤 아이디어 나 도움을 주시면 감사하겠습니다. 감사. AngularJS와 소스 코드에 다이빙 내가 해결책을 찾았 동안

답변

2

.

문제

는 래퍼 객체 대신 함수를 반환되었고,이 몇 가지 문제를주고 있었다이었다. 이 솔루션은 래퍼에서 다음 행을 변경하는 것입니다 :

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

일이 함께 :

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

이유는 무엇입니까? 빠른 대답은 각 자원의 소스 코드에서 사용하기 때문입니다. 사실이 함수를 호출 객체에 보내는 함수를 # 호출하십시오. 이것은 종종 객체를 초기화하는 데 사용됩니다. Learn more here.

관련 문제