在之前的文章中讲到了在使用$resource的时候,有一个isArray属性. 这个属性在两个地方有提到:

1. angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

$resource的四个方法: query方法,get方法,save方法,remove方法,delete方法

这四个方法里,唯独query方法,它的isArray属性是true,所以,query接受到的数据是数组,而其余四个方法,接收到的数据必须不能是数组

2. angular学习笔记(二十八-附1)-$resource中的资源的方法

$resource的自定义方法: 比如该篇的栗子中使用的$charge方法,在定义自定义方法的时候,也要指定isArray属性.不指定的话默认是false.

如果我们不设置isArray为true,但是后台却给它返回一个数组资源,是会报错的.

那么,如果在使用get方法,save方法,remove方法,delete方法的时候,需要返回数组对象呢? 答案是不能的.因为$resource这个服务没有提供相应的配置方法.

那么,如果自定义一个方法,设置isArray为true,是不是就可以接受数组格式的返回值了呢? 答案是,要看情况!

比如下面这段代码:

var notePad = angular.module('notePad',['ngResource']);
notePad.factory('myNotes',['$resource',function($resource){
return $resource('/notes/:id',{id:'@id'},{mysave:{method:'POST',isArray:true}})
}]);
notePad.factory('loadNotes',['myNotes','$q',function(myNotes,$q){
return function(){
var defer = $q.defer();
myNotes.query(function(notes){
defer.resolve(notes);
},function(err){
defer.reject(err)
});
return defer.promise
}
}]);
notePad.factory('loadNote',['myNotes','$q',function(myNotes,$q){
return function(noteId){
var defer = $q.defer();
myNotes.get({id:noteId},function(note){
defer.resolve(note);
},function(err){
defer.reject(err)
});
return defer.promise
}
}]);
notePad.directive('notepad',['loadNotes','myNotes',function(loadNotes,myNotes){
return {
restrict:'EA',
templateUrl:'template.html',
scope:{},
link:function(scope,iEle,iAttr){
scope.editMode = false;
scope.curText = '';
scope.ifNew = true;
loadNotes().then(function(data){scope.notes=data},function(data){});
var editBox = iEle.find('.edit');
editBox.bind('keydown keyup',function(){
scope.curText = $(this).html()
});
scope.editNote = function(id){
scope.editMode = true;
if(id != undefined){
scope.curText = scope.notes[id]['content']
}
else {
scope.curText = '';
}
};
scope.saveNote = function(){
scope.editMode = false;
if(scope.ifNew){
var newNote = new myNotes();
newNote.content = scope.curText;
newNote.title = scope.curText.length>5 ? scope.curText.substring(0,5)+'...' : scope.curText;
newNote.id = scope.notes.length;
newNote.$mysave(function(data){console.log(data)})
}
}
}
}
}]);

内容比较多,只看关键部分代码:

1.myNotes服务通过$resource创建$resource()对象,然后给它添加自定义的mysave方法,设置isArray属性为false.

2.实例化一个newNote资源,然后调用自定义的$mysave方法

后台我们给它返回一个数组对象:

var notes = [{
'title':'吃饭',
'content':'吃饭啊',
'id':0
},{
'title':'睡觉',
'content':'睡觉啊',
'id':1
},{
'title':'喂兔子',
'content':'喂兔子啊',
'id':2
}];
app.post('/notes/:id',function(req,res){
var noteId = req.params.id;
notes[noteId] = req.body;
res.send(notes)
});

结果报错: 

这个很好理解,因为我们设置了isArray是false嘛.

然后我把isArray属性改为true:

结果还是报错:

百思不得其解后去看了angular-resource的源码,发现里面有这样一段:

var isInstanceCall = this instanceof Resource;
var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));
if (action.isArray) {
value.length = 0;
forEach(data, function (item) {
if (typeof item === "object") {
value.push(new Resource(item));
} else {
// Valid JSON values may be string literals, and these should not be converted
// into objects. These items will not have access to the Resource prototype
// methods, but unfortunately there
value.push(item);
}
});
}

注意这里的value对象,并非设置isArray为true时,它就是[],首先要求isInstanceCall是false,然后再判断isArray...

所以,这里的newNote是$resource()的实例,这样,isArray无论如何配置,它都不能接受数组格式的返回数据.并且必须配置为false.

所以这里应该这样做:


newNote.$mysave(function(data){console.log(data)})

//改为:
myNotes.mysave(newNote,function(data){console.log(data)});

不要使用资源实例的方法,而是直接使用$resource()的方法.这样就可以正确接收数组格式的返回值了.

angular这样设计,应该是符合RESTful架构风的(我猜的),因为提交一个资源,那么返回的也应该是一个资源,而不应该是整个数组,所以应该尽量避免这种做法.这里只是我自己做练习的时候遇到这样的情况.

完整代码参考: angular指令实战-notepad

关于angular的$resource中的isArray属性问题的更多相关文章

  1. angular学习笔记(二十八-附1)-$resource中的资源的方法

    通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,$save,$delete,$remove,可以直接调用来保存该资源: 比如有一个$resour ...

  2. Angular JS中自定义标签 属性绑定的解释

    看到自定义标签的文档时,文档作者解释的能力实在太弱,也可能是本人太笨,一下绕不过来. 看了一个stackoverflow答案,才算明白,在此贴出翻译,以供大家参考. .csharpcode, .csh ...

  3. http请求头中的Content-Type属性在angular 和 node中的用法

    post请求的请求体有以下两种格式: 1. 字符串: 'name=code_bunny&age=12' 这种格式的请求体,需要配置请求头 'Content-Type':'application ...

  4. 白话$resource,$resource中的增删改查

    前言 $resource详解,在学习angular的过程中,我们已经知道,$http能十分便捷的为我们实现与后端的数据交互,格式如下: $http({method:'GET'},url:'XX').t ...

  5. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  6. Angular 2.0 从0到1:Rx--隐藏在Angular 2.x中利剑

    第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2.0 从0到1 (三)第四节:Angular 2.0 从0到1 (四)第五节: ...

  7. @Resource注解省略name属性后的行为

    @Resource有一个name属性,该属性值为所要注入的Bean实例的id,类似于<property.../>元素的ref属性,不过在spring中允许省略name属性值,省略后在以下情 ...

  8. 【转载】在Angular 2/Typescript中声明全局变量的最佳方式是什么?

    问题详细描述 我想在Typescript语言中的Angular 2中声明一些全局可见的变量.最佳的实践方法是? 推荐的实现方法 这是最简单的解决方案,无需使用Service或Observer: 将全局 ...

  9. 这些Android系统样式中的颜色属性你知道吗?

    Android 系统样式中的颜色属性 推荐阅读看完后彻底搞清楚Android中的 Attr . Style .Theme 几个常用的颜色属性 先放上一张经典的图片,图片来自网络. 这张图在网上很是流传 ...

随机推荐

  1. Arduino——My-Clock项目 发布时间:2018-12-31

    技术:Arduino.光敏传感器.DHT11.DS1302.OLED显示屏   概述 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块用于获取时间 ...

  2. Dubbo创建提供者&消费者工程

    1. 前言 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载.如果不想使 ...

  3. Docker 技巧:删除 Docker 所有镜像

    删除所有未运行 Docker 容器 docker rm $(docker ps -a -q) 删除所有 Docker 镜像 删除所有未打 tag 的镜像 docker rmi $(docker ima ...

  4. ios中自定义button

    自定义button #import <UIKit/UIKit.h> #define KFont 15 @interface DIYButton : UIButton @property(n ...

  5. 使用httpClient调用接口获取响应数据

    转自:https://blog.csdn.net/shuaishuaidewo/article/details/81136088 import lombok.extern.slf4j.Slf4j; i ...

  6. 清除li内a标签的float=left实现a标签在li内居中显示(ul内li不居中显示)

    写在前面: 修改cnblogs主页面菜单显示问题. 问题描述:在给主菜单添加hover样式后发现菜单内容并未居中.见图1. 网上搜索到资料其中一篇讲的可以说简明扼要了,也是伸手党的福利(点我查看原文) ...

  7. libev与libevent区别

    摘自stackflow的回答,主要从架构上说明了二者的区别: As for design philosophy, libev was created to improve on some of the ...

  8. 使用Anemometer分析MySQL慢查询记录

    数据库管理员一般是用percona的toolkit工具来分析MySQL慢查询记录,但是不够直观. 下面介绍一款比较直观的工具来统计分析MySQL慢查询记录anemometer. 在使用之前需要安装pe ...

  9. 实体格式化转xml

    In the past, I've done the following to control datetime serialization: Ignore the DateTime property ...

  10. Runway for Mac(UML 流程图绘图工具)破解版安装

    1.软件简介    Runway 是 macOS 系统上一款强大实用的软件开发工具,Runway for Mac 是一个界面简单功能强大的UML设计师.此外,Runway for Mac 带给你所有你 ...