Ответ 1
$resource.get
метод, по умолчанию, ожидает, что ответ JSON будет объектом (при анализе).
При вызове $resource.get()
результат будет экземпляром ресурса $.
В вашем примере вызов Member.get({id:1})
приведет к экземпляру $resource, который создается путем вызова new Member()
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}