Angular.js $资源结果

时间:2013-09-02 15:31:37

标签: angularjs

我发现Angular $资源的行为非常奇怪。请查看以下代码行:

    class Service
        constructor: ($resource) ->
            service = $resource '/record/:id'

            Service::list = (cb) ->
                service.query().$promise.then (data) ->
                    #result: data == [e, $promise: Object, $resolved: true]
                    cb data

            Service::get = (id, cb) ->
                service.get(id:id).$promise.then (data) ->
                    #result: data == {id: 1, name: 'name' ...}
                    cb format data

服务“get”方法返回服务器发送的正确值(对象),但“list”方法返回数组包含$ promise和$ resolved ...

有没有人有一些逻辑解释?

更新:

我发现了问题。服务结果是字符串数组,导致sting chars的结果数组。这可以通过使用$ http而不是$ resource来解决。

例如:

服务器端 - > ['list','of','elements']

客户端 - > ['l','我','s','t']

3 个答案:

答案 0 :(得分:5)

如果像我一样,您希望您的回复为您提供没有额外$ promise和$ resolved属性的数据,您可以修改资源并添加一个拦截器'如下所述: http://docs.angularjs.org/guide/migration#resource-promises-are-resolved-with-the-resource-instance

对于get,它将如下所示:

var Resource = $resource('/url', {}, {
  get: {
    method: 'get',
    interceptor: {
      response: function(response) {
        // expose response
        return response;
      }
    }
  }
});

然后,您可以在发出get请求时访问响应对象而不是资源实例。例如:

Resource.get(function(response){
    angular.forEach(response.data, function(value, key){

    }, $scope.varName);
});

这也意味着您可以访问其他响应属性,例如response.statusresponse.headers以及使用response.resource获取资源的实例。

答案 1 :(得分:2)

  

但作为结果的“list”方法返回包含$ promise和$ resolved

的数组

仔细检查一下 - 当数组具有额外属性时,Chrome在console.log内显示数组的方式具有误导性。例如,请在Chrome控制台中尝试以下操作:

> a = [1, 2, 3]

> a.$promise = 'thing'

> a.$resolved = true

> a
  [1, 2, 3]

> console.log(a)
  [1, 2, 3, $promise: "thing", $resolved: true]

正如您所看到的,它将$promise$resolved列为数组的元素,即使它们实际上不是 数组。

答案 2 :(得分:0)

documentation本身提到了这个及其用法

  

资源实例和集合具有这些附加功能   属性:

     

$ promise:创建的原始服务器交互的承诺   这个实例或集合。

     

成功时,使用相同的资源实例解析promise   集合对象,使用服务器中的数据更新。这很容易   在$ routeProvider.when()的resolve部分中使用来推迟查看   渲染,直到加载资源。

     

失败时,使用http响应对象解析promise,   没有资源属性。

     

$ resolved:在第一次服务器交互完成后为true(也就是说   成功或拒绝),之前是假的。知道资源   已经解决的数据绑定很有用。