我发现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']
答案 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.status
,response.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(也就是说 成功或拒绝),之前是假的。知道资源 已经解决的数据绑定很有用。