Angular.js$资源结果



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

    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。。。

有人有逻辑解释吗?

更新:

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

例如:

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

客户端->['l','i','s',not']

如果你像我一样希望你的响应给你不带额外$promise和$resolved属性的数据,你可以修改资源并添加一个"拦截器",如下所述:http://docs.angularjs.org/guide/migration#resource-promise通过资源实例解决

对于获得它将看起来像这样:

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获取资源的实例。

但是作为结果返回数组的"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列为数组的元素,尽管它们实际上并不在数组的中。

文档本身提到了这一点及其使用

Resource实例和集合具有以下附加属性:

$promise:创建的原始服务器交互的promise此实例或集合。

成功后,使用相同的资源实例或集合对象,使用服务器中的数据更新。这让它变得容易在$routeProvider.when()的解析部分中使用以推迟视图渲染,直到加载资源为止。

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

$resolved:在第一次服务器交互完成后为true(或者成功或被拒绝),在此之前是错误的。了解资源已解决在数据绑定中很有用。

相关内容

最新更新