1)我们首先需要引入ng-Resource 模块,在angular之后
可以把User对象理解成同RESTful的后端服务进行交互的接口。
①GET请求: get(params,successFn,errrorFn)
不定义具体的参数,get()请求通常被用来获取单个资源。
//发送一个请求 with the body {name: 'Ari'}
User.save({},{name:'Ari'},function(resp){$resource对常见的五种请求进行封装,我们还可以对$resource进行扩展,这里要扩展$resource我们需要传入第三个参数,该参数是一个对象。
$resource('/api/users',{},{
sendEmail:{
method:'',
url:'',
params:{},
isArray:boolean,
transformRequest:函数或者函数数组
transformResponse:函数或者函数数组
cache:布尔型或缓存对象
timeout:数值或promise对象
withCredentials:布尔类型
responseType:字符串,用来设置XMLHttpRequestResponseType属性
}
})
示例1:简单的CRUD --摘自点击打开链接 这哥们总结的很全面
var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save();
});
注意上面代码中的”@id”和”$save()”,使用了@后,当执行$save时,user.id就会被当做userId的值来发送请求。
以这种方式封装Ajax,不仅仅使得代码更加优雅,而且还能配合ng的视图渲染:当数据没有返回之前,模板引擎不会渲染,一旦异步数据获取完成,会自动触发模板引擎的渲染机制把数据呈现到视图中。
简单来说,上述方法在返回数据时,响应会被一个原型类包装,并在实例中添加一些有用的方法。
有以下三个实例方法:
这三个方法可以在资源实例上被调用,如上所示。需要格外注意,这三个方法在调用时$resource对象会立即返回一个空的数据引用。由于所有方法都是异步执行的,所以这个数据是一个空的引用,并不是真实的数据。
因此,虽然获取实例的调用看起来是同步的,但实际上不是。事实上,它只是数据的引用,当数据从服务器返回后AngularJS会自动将数据填充进去。
比如:
// $scope.user将为空
$scope.user = User.get({id: '123'});
这些方法也提供了回调函数,在数据返回时按预期的方式调用:
User.get({id: '123'}, function(user) {
$scope.user = user;
});
服务配置方法:$resource(url,[paramDefaults],[ actions]);
我们也可以将$resource服务当做自定义服务的基础。
angular.module('testApp', ['ngResource']),factory('UserService',['$resource', function($resource){
return $resource(url,{},{});
}]);
app.factory('CreditCard', ['$resource', function($resource) {
return $resource('/usr/:userId/card/:cardId',
{userId: 123, cardId: '@id'},
{
charge: { //自定义的方法
method: 'POST',
params: {charge: true}, //表示需要作为请求的一部分来传递的参数
isArray: false
}
})
}]);
说明:这是一种非常灵活的编码风格,根据上面的代码,对于配置对象{charge: {method: 'POST', params: {charge: true}, isArray: false},Angular会将其解析成一个方法,然后把这个方法绑定到返回的Restful对象上,上面的配置对象解释之后的方法为:
CreditCard.charge = function(charge, isArray) { //这里是方法体 }
define([
'{angular}/angular',
'{angular-sanitize}/angular-sanitize',
'{w20-ui}/modules/select'
], function (angular) {
'use strict';
var hubComponentImport = angular.module('hubComponentImport', ['ui.select', 'ngSanitize']);
hubComponentImport.controller('hubImportComponentCtrl', ['$scope', '$routeParams', '$timeout','$resource','$location', function ($scope, $routeParams, $timeout,$resource,$location) {
$scope.editComponent = function () {
//初始化参数
$scope.component= {tags:[]};
//利用$resource自定义post方法
var Components= $resource('rest/components/url',{},{
getComponent: {method:'POST'}
});
//接收页面输入数据,并发送请求
var component= Components.getComponent({},{url:$scope.componentUrl},function(data){
$scope.component = data;
});
//转向edit.html页面
$scope.searchComponent = 'manage/views/edit.html';
};
}]);
return {
angularModules: [ 'hubComponentImport' ]
};
});