2014-01-22 2 views
12

Как получить нулевой ответ от $ resource?

Я бегу это:

angular.module("services").factory('Member', function($resource) { 
    var Member = $resource('/api/v1/member.json'); 

    Member.current = Member.get(); 

    return Member; 
}); 

Но сервер отвечает с:.

null 

Поскольку пользователь не вошел в систему

Но когда я вхожу результат я получаю это:

Resource 
    0: "n" 
    1: "u" 
    2: "l" 
    3: "l" 
    $promise: Object 
    $resolved: true 
    __proto__: Resource 

Где бы я ожидал буквально null.

+1

почему эти хорошие невысказанный вопросы получить так мало внимания в эти дни? Btw @stewie ответил на вопрос о точке (y) – angabriel

ответ

14

$resource.get метод по умолчанию ожидает ответ JSON, чтобы быть объектом (при разобран). При вызове $resource.get() результатом будет экземпляр ресурса $.

В вашем примере, вызов Member.get({id:1}) произведет экземпляр $ ресурса, который создается путем вызова new Member()source, а затем populated source (когда XHR завершается) со свойствами анализируемого ответа JSON:

shallowClearAndCopy(data, value); 

Сигнатура функция, с которой ваш Member экземпляр заселен выглядят следующим образом:

function shallowClearAndCopy(src, dst) { 
    dst = dst || {}; 

    angular.forEach(dst, function(value, key){ 
    delete dst[key]; 
    }); 

    for (var key in src) { 
    if (src.hasOwnProperty(key) && key.charAt(0) !== '$' && key.charAt(1) !== '$') { 
     dst[key] = src[key]; 
    } 
    } 

    return dst; 
} 

Бросив тело функции вы поймете, что функция не ожидает src параметр должен быть чем угодно, кроме объекта (for (var key in src) { ...). Таким образом, если вы предоставите его шпагатом "null" результат будет:

{1: "n", 2: "u", 3: "l", ...} 

ngResource построен для поддержки RESTfull API с JSON в качестве подразумеваемого формата передачи данных, поэтому вы не сможете использовать ответы, такие как "null" или что-либо еще, что не является действительным JSON.


Если не указано иное.

Если вы не сделаете использование transformResponse конвертировать "null" что-то вроде {'null': true} на лету:

app.factory('Member', function($resource) { 
    var Member = $resource('member.txt', {}, { 
    get: { 
     method: 'GET', 
     isArray: false, 
     transformResponse: function(data, headersGetter){ 
     if(data === 'null'){ 
      return {null: true}; 
     } 
     return angular.fromJson(data); 
     } 
    } 
    }); 
    return Member; 
}); 

$scope.member = Member.get({id: 1}); 
console.log($scope.member); // --> {null: true} 

DEMO

+0

работал как шарм – Lekhnath

2

Ваш код выглядит хорошо. Но видеть такой вывод в консоли - это боль в -muted. Один хочет, чтобы исправить это сразу же, установив какие-либо опции для форматов результатов, изменение адреса, HTTP/HTTPS // пустячный и т.д.

Но дело

Вызов URL, который не допускается, так как пользователь не вошел в систему.

Один ожидает приятный 403 около того $resource сек обработчик ошибок выполняется.

Таким образом, ваш обработчик результата не выполняет вообще;)

Member.current = Member.get; //note removed() here 

// then outside call: 
Member.current(
    function(result) { 
    // should not execute for 403 
    }, 
    function(fault) { 
    // TODO: handle case: 'user not logged in' 
    }); 
Смежные вопросы