如何从$资源获得空响应?

Pet*_*tah 13 javascript angularjs angularjs-resource

如何从$资源获得空响应?

我正在运行这个:

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

  Member.current = Member.get();

  return Member;
});
Run Code Online (Sandbox Code Playgroud)

但服务器响应:

null
Run Code Online (Sandbox Code Playgroud)

因为用户未登录.

但是当我记录结果时,我得到了这个:

Resource
  0: "n"
  1: "u"
  2: "l"
  3: "l"
  $promise: Object
  $resolved: true
  __proto__: Resource
Run Code Online (Sandbox Code Playgroud)

我在字面上的预期null.

Ste*_*wie 14

$resource.get默认情况下,方法期望JSON响应是一个对象(解析时).调用时$resource.get(),结果将成为$ resource的一个实例.

在您的示例中,调用Member.get({id:1})将生成一个$ resource实例,该实例是通过调用new Member() source创建的,然后填充(当XHR完成时),其中包含已解析的JSON响应的属性:

shallowClearAndCopy(data, value);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

浏览函数体,您将意识到函数不希望src参数只是object(for (var key in src) { ...).所以,如果你提供字符串"null",结果将是:

{1: "n", 2: "u", 3: "l", ...}
Run Code Online (Sandbox Code Playgroud)

ngResource构建为支持使用JSON作为隐含数据传输格式的RESTfull API,因此您将无法使用响应,例如"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}
Run Code Online (Sandbox Code Playgroud)

DEMO