关于angular的$resource中的isArray属性问题
在之前的文章中讲到了在使用$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属性问题的更多相关文章
- angular学习笔记(二十八-附1)-$resource中的资源的方法
通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,$save,$delete,$remove,可以直接调用来保存该资源: 比如有一个$resour ...
- Angular JS中自定义标签 属性绑定的解释
看到自定义标签的文档时,文档作者解释的能力实在太弱,也可能是本人太笨,一下绕不过来. 看了一个stackoverflow答案,才算明白,在此贴出翻译,以供大家参考. .csharpcode, .csh ...
- http请求头中的Content-Type属性在angular 和 node中的用法
post请求的请求体有以下两种格式: 1. 字符串: 'name=code_bunny&age=12' 这种格式的请求体,需要配置请求头 'Content-Type':'application ...
- 白话$resource,$resource中的增删改查
前言 $resource详解,在学习angular的过程中,我们已经知道,$http能十分便捷的为我们实现与后端的数据交互,格式如下: $http({method:'GET'},url:'XX').t ...
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- 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 (四)第五节: ...
- @Resource注解省略name属性后的行为
@Resource有一个name属性,该属性值为所要注入的Bean实例的id,类似于<property.../>元素的ref属性,不过在spring中允许省略name属性值,省略后在以下情 ...
- 【转载】在Angular 2/Typescript中声明全局变量的最佳方式是什么?
问题详细描述 我想在Typescript语言中的Angular 2中声明一些全局可见的变量.最佳的实践方法是? 推荐的实现方法 这是最简单的解决方案,无需使用Service或Observer: 将全局 ...
- 这些Android系统样式中的颜色属性你知道吗?
Android 系统样式中的颜色属性 推荐阅读看完后彻底搞清楚Android中的 Attr . Style .Theme 几个常用的颜色属性 先放上一张经典的图片,图片来自网络. 这张图在网上很是流传 ...
随机推荐
- Adobe After Effects CS6 操作记录
安装 After Effects CS6 在Mac OS 10.12.5 上无法直接安装, 需要浏览到安装的执行文件后才能进行 https://helpx.adobe.com/creative-clo ...
- 转:Ogre源码剖析1
初学Ogre 貌似看到一些套路(ajohn) 1 Ogre的编译 获得最新的Ogre 1.71 和之前的Ogre比起来,除了sampler集成之外,最大的改变就是编译过程加入了Cmake,这个东西其 ...
- 敏捷开发与Scrum
敏捷开发以用户的需求进化为核心,采用迭代.循序渐进的方法进行软件开发.在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视.可集成和可运行使用的特征.换言之,就是把 ...
- (原)tensorflow中finetune某些层
转载请注明处处: http://www.cnblogs.com/darkknightzh/p/7608709.html 参考网址: https://kratzert.github.io/2017/02 ...
- iOS 批量打包
如果你曾经试过做多 target 的项目,到了测试人员要测试包的时候,你就会明白什么叫“生不如死”.虽然 Xcode 打包很方便,但是当你机械重复打 N 次包的时候,就会觉得这纯粹是浪费时间的工作.所 ...
- iphone 恢复出厂设置方法
1.下载安装并打开itunes. 2.让手机进入恢复模式: 一.先长按住电源键,出现关机选项时,请滑动关机: 二.随后再按电源键开机,屏幕会出现苹果标志,不要松开电源键: 三.接着再按住主屏 Home ...
- 【Visual Studio】Visual Studio中常用的快捷键收集
添加注释:Ctr+k+c 取消注释:Ctr+k+u 格式化:Ctr+a+k+f 当前光标自动向下移一行:Ctr+Shift+Enter 运行:F5 进入光标指定的方法或是类:F12 在当前文件中查找: ...
- 【Spring】SpringMVC之拦截器
Spring的HandlerMapping处理器支持拦截器应用.当需要为某些请求提供特殊功能时,例如实现对用户进行身份认证.登录检查等功能. 拦截器必须实现HandlerInterceptor接口,实 ...
- 【JavaScript】浅析ajax的使用
目录结构: contents structure [+] Ajax简介 Ajax的工作原理 Ajax的使用步骤 使用原生的js代码 使用JQuery代码 JQuery中常用的Ajax函数 $.ajax ...
- 【Oracle】Oracle基本数据类型总结
ORACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.LOB类型.LONG RAW& RAW类型.ROWID &am ...