2014-01-22 136 views
12

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

我正在此:

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})会产生被与解析的JSON响应的特性呼唤new Member()source然后populated source(当XHR完成)创建的$资源实例:

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是建立在支持与一个JSON API的REST类型作为一个隐含的数据传输格式,因此你将无法使用响应,如"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' 
    });