了解 angularJS $resource isArray 属性

Posted

技术标签:

【中文标题】了解 angularJS $resource isArray 属性【英文标题】:Understanding angularJS $resource isArray property 【发布时间】:2015-04-14 10:26:47 【问题描述】:

我正在学习 Angular 的 $resource 服务,并在 angular tutorial 中添加了一个自定义操作(查询),其 method 设置为 'get' 和 isArray设置为真

return $resource('phones/:phoneId.json', , 
      query: method:'GET', params:phoneId:'phones', isArray:true
 );

但是,如果您查看 the docs for $resource,“查询”操作已经将其 方法 设置为“获取”,并且 isArray 已经被 默认。所以我想我可以把这些属性排除在外。

这适用于 method 属性,但事实证明,如果我省略 isArray 属性,我会收到此错误:

错误:[$resource:badcfg] 操作资源配置错误 query。预期响应包含一个对象但得到一个数组

这是为什么呢?

【问题讨论】:

您是否从 $resource 中删除了查询? return $resource('phones/:phoneId.json'); 不,我刚刚删除了方法属性,我想删除 isArray 属性,但这不起作用 但是为什么您要创建/替换自定义查询操作,因为已经内置了一个?使用我发布的代码,查询将起作用 【参考方案1】:

我认为您误解了文档。

默认情况下不添加任何自定义操作,支持以下:

'get':    method:'GET',
'save':   method:'POST',
'query':  method:'GET', isArray:true,
'remove': method:'DELETE',
'delete': method:'DELETE' 

所以默认情况下,query 操作期望返回一个数组,这是有道理的,因为查询通常会返回一个项目数组。

所以如果你使用:

phonecatServices.factory('Phone', ['$resource', function($resource)
    return $resource('phones/phones.json');
]);

然后您可以执行如下查询:

var queryParams =  name: 'test' ;

Phone.query(queryParams, , function (response) 
    $scope.phones = response;
);

现在,如果您想添加自定义操作,那么 isArray 的默认值为 false 所以:

return $resource('phones/:phoneId.json', , 
      someCustomAction: method:'GET', params:phoneId:'phones' 
);

需要返回一个对象。如果返回一个数组,则需要将 isArray 设置为 true,如下所示:

return $resource('phones/:phoneId.json', , 
      someCustomAction: method:'GET', params:phoneId:'phones', isArray: true 
);

【讨论】:

公平地说,很容易误解 Angular 的文档。 :)

以上是关于了解 angularJS $resource isArray 属性的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS:具有嵌套资源的 $resource

AngularJS:使用 $resource 上传文件(解决方案)

AngularJS $resource GET 中的多个参数

AngularJS - 将 REST 搜索端点映射到 $resource

angularjs $resource 和一对多关系

angularjs $resource 类级回调,或后处理