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

比如有一个$resource创建的服务:

var service = angular.module('myRecipe.service',['ngResource']);
service.factory('Recipe',['$resource',function($resource){
return $resource('/recipe/:id',{id:'@id'});
}]);
service.factory('loadRecipes',['Recipe','$q',function(Recipe,$q){
return function(){
var defer = $q.defer();
Recipe.query(function(recipes){
defer.resolve(recipes)
},function(err){
defer.reject(err)
});
return defer.promise
}
}]);
service.factory('loadRecipe',['Recipe','$q','$route','$routeParams',function(Recipe,$q,$route,$routeParams){
return function(){
var defer = $q.defer();
Recipe.get({id:$route.current.params.recipeId},function(recipe){
defer.resolve(recipe)
},function(err){
defer.reject(err)
});
return defer.promise
}
}]);

然后我通过loadRecipe方法获取到了一个recipe,修改了recipe后需要对它进行提交保存,以下两种方式是一样的:

1. 通过$resource的save方法(第一个参数是请求提,第二个参数是请求完成后的回调)

        Recipe.save($scope.recipe,function(){
$location.path('/view/'+$scope.recipe.id)
});

2. 由于recipe本身就是通过$resource获取的资源,所以它拥有$save方法,$save方法里的函数就是保存成功后的回调.

        $scope.recipe.$save(function(){
$location.path('/view/'+$scope.recipe.id)
});

除了通过loadRecipe获取到的资源,通过$resource实例化的资源也有$save方法:

比如下面的recipe:

    $scope.recipe = new Recipe({
ingredients:[{}]
});
$scope.save = function(invalid){
if(invalid){
return false
}
Recipe.save($scope.recipe,function(recipe){
$location.path('/view/'+recipe.id)
});
};

$resource()中第二个参数{id:'@id'},表示url中的:id 将会使用资源的id属性值,也就是recipe的id属性值.

还可以通过$resource()第三个参数来给资源自定义方法:

return $resource('/card/user/:userID/:id',{userID:123,id:'@id'},{charge:{method:'POST',params:{charge:true},isArray:false}})

来分析一下这里的第三个参数 {charge:{method:'POST',params:{charge:true},isArray:false}}

1.charge是自定义方法的名字,资源就可以通过$charge()来调用该自定义方法

2.charge属性值是一个json对象,里面有三个属性:

method: 该方法的请求方式: 'POST','GET','DELETE','PUT',等,这里的请求方式可以自定义方法,$resource()返回的对象的get,query,save,remove,delete里用到的只有'GET','POST','DELETE'三种请求方式,但是这里自定义的方法,可以使用$http的所以请求方式. 所以,如果要自定义请求方式,也是通过自定义方法来创建的.

params: 定义请求url后面的参数,这里是{charge:true},就会向url?charge=true发送请求

isArray: 定义返回的数据的格式是否是数组

3.charge属性值除了2里说到的三个属性,还有所有$http里所有可配置的项:

headers:,

transformRequest:,

transformResponse:,

cache:,

timeout:,

withCredentials:

这些项的意思和具体怎么配置,请参考之前将$http的文章,他们是一致的.

eg:

HttpREST.factory('cardResource',function($resource){
return $resource('/card/user/:userID/:id',{userID:123,id:'@id'},{charge:{method:'POST',params:{charge:true},isArray:false}})
}); HttpREST.factory('httpCard',function($q,cardResource){
return {
getById:function(cardID){
var defer = $q.defer();
cardResource.get({id:cardID},function(data,headers){
defer.resolve(data);
},function(data,headers){
defer.reject(data);
});
return defer.promise
}
}
}); $scope.addCharge = function(){
$scope.card_1.then(function(card){
card.$charge({amount:100});
})
}

注意,card_1得到的是promise对象,而不是资源本身,要获得实际的资源,要通过它的then方法里的函数的参数来获得.关于这个问题,请查看:

http://www.cnblogs.com/liulangmao/p/3907307.html

$charge里的参数表示url后面的参数,也就是说:

card.$charge({amount:100}) 向/card/user/123/?charge=turn&amount=100发送了post请求,请求体就是card

请求url里的1是因为在$resource()第二个参数中配置了{id:@id},所以就是card的id,

请求参数是charge=true是因为在$resource()第三个参数中配置了{charge:{params:{charge:true}}
请求方式是post是因为在$resource()第三个参数中配置了{charge:{method:'POST',params:{charge:true}}}

请求参数是amount=100是因为在调用card.$charge()的时候传入了参数{amount:100}

资源的方法还有一个特性: 在请求完成后,会自动用返回值来填充调用方法的资源,继而更新视图.无需在回调手动处理:

eg:

html:

  <button ng-click="addCharge()">给建设银行的卡充值100元</button>
<br/>
<span>{{card_1['name']}}</span>
<span>{{card_1['amount']}}</span>
<br/>

js:

    $scope.addCharge = function(){
$scope.card_1.then(function(card){
card.$charge({amount:100});
})
}

node:

app.post('/card/user/123/:id',function(req,res){
var index = req.params.id ? req.params.id-1 : cards.length;
var query = url.parse(req.url,true)['query'];
if (query.charge){
cards[index]['amount']+= Number(query['amount'])
}
else {
cards[index] = req.body;
}
res.send(cards[index]);
});

点击充值后,后台会给建设银行卡添加100元,然后再把建设银行卡这个资源返回给客户端:

点击按钮后:

我们可以看到,在card.$charge({amount:100})这个调用中,我们并没有书写回调来改变$scope.card_1,但是视图里card_1['amount']确实发生了变化,原因是,

angular自动将返回值填充了card,而card是card_1的$$v属性值(关于$$v请查看http://www.cnblogs.com/liulangmao/p/3907307.html),所以视图里的card_1也会被更新.

angular学习笔记(二十八-附1)-$resource中的资源的方法的更多相关文章

  1. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

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

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  3. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  4. angular学习笔记(二十九)-$q服务

    angular中的$q是用来处理异步的(主要当然是http交互啦~). $q采用的是promise式的异步编程.什么是promise异步编程呢? 异步编程最重要的核心就是回调,因为有回调函数,所以才构 ...

  5. Java基础学习笔记二十八 管家婆综合项目

    本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...

  6. angular学习笔记(二十六)-$http(4)-设置请求超时

    本篇主要讲解$http(config)的config中的timeout项: $http({ timeout: number }) 数值,从发出请求开始计算,等待的毫秒数,超过这个数还没有响应,则返回错 ...

  7. angular学习笔记(二十五)-$http(3)-转换请求和响应格式

    本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transfo ...

  8. angular学习笔记(二十四)-$http(2)-设置http请求头

    1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 Accept:application/json,text/plain       ...

  9. angular学习笔记(二十二)-$http.post

    基本语法: $http.post('url',{},{}).success(function(data,status,headers,config){ }).error(function(data,s ...

随机推荐

  1. 关于gitignore文件的创建与使用

    在我们使用github提交本地代码时,有些库文件和日志文件是不必要提交的,那如何处理这个问题呢?这个时候我们就会用到.gitignore文件了. 该篇博客我会介绍如何创建.gitignore,以及如何 ...

  2. linq to js使用汇总

    用途:方便js操作查询json数据. 下载网址:http://jslinq.codeplex.com/ 使用方法:只需要引用linq.js即可. 查询方法: 一.where查询 var myList ...

  3. linux2.6 内存管理——逻辑地址转换为线性地址(逻辑地址、线性地址、物理地址、虚拟地址)

    Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Linux运行在虚拟存储空间,并负责把系 ...

  4. 如何重新注册VMware Update Manager(VUM)至vCenter Server中

    在VMware的vSphere化境中,VUM的角色相当于Windows 环境中的WSUS(Windows 更新服务器),可以批量,自动化的完成所管辖ESXi主机的大版本迁移,小版本升级的任务,深受管理 ...

  5. Oracle数据库验证IMP导入元数据是否会覆盖历史表数据

    场景:imp导入数据时,最终触发器报错退出,并未导入存储过程.触发器.函数. 现在exp单独导出元数据,然后imp导入元数据,验证是否会影响已导入的表数据. 测试环境:CentOS 6.7 + Ora ...

  6. 读书笔记--SQL必知必会17--创建和操纵表

    17.1 创建表 使用CREATE TABLE语句创建表. 不同的DBMS中CREATE TABLE语句的语法可能不同. 17.1.1 表创建基础 利用CREATE TABLE创建表,必须具备如下信息 ...

  7. C#中的委托解析

    谈及到C#的基本特性,“委托”是不得不去了解和深入分析的一个特性.对于大多数刚入门的程序员谈到“委托”时,都会想到“将方法作为方法的参数进行传递”,很多时候都只是知道简单的定义,主要是因为“委托”在理 ...

  8. 前端CSS部分知识整理

    1.如何清除图片下方出现几像素的空白间隙? /*方法1:*/ img{display:block;} 方法2: /*img{vertical-align:top;}*/ 2.如何让文本垂直对齐文本输入 ...

  9. 7.JAVA之GUI编程鼠标事件

    鼠标事件: 功能: 1.基本窗体功能实现 2.鼠标移动监听,当鼠标移动到按钮上时,触发打印事件. 3.按钮活动监听,当按钮活动时,触发打印事件. 4.按钮被单击时触发打印事件. 源码如下: impor ...

  10. iOS: 为画板App增加 Undo/Redo(撤销/重做)操作

    这个随笔的内容以上一个随笔为基础,(在iOS中实现一个简单的画板),上一个随笔实现了一个简单的画板:   今天我们要为这个画板增加Undo/Redo操作,当画错了一笔,可以撤销它,或者撤销之后后悔了, ...