### 15.3. 基本使用
在定义了资源之后,我们看如果使用这些资源,发出请求:
var book = Book.read({id: '123'}, function(response){
console.log(response);
});
这里我们进行 _Book_ 的“类”方法调用。在方法的使用上,根据官方文档:
HTTP GET "class" actions: Resource.action([parameters], [success], [error])
non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
non-GET instance actions: instance.$action([parameters], [success], [error])
我们这里是第二种形式,即类方法的非 GET 请求。我们给的参数会作为 `postData` 传递。如果我们需要 GET 参数,并且还需要一个错误回调,那么:
var book = Book.read({get: 'haha'}, {id: '123'},
function(response){
console.log(response);
},
function(error){
console.log(error);
}
);
调用之后,我们会立即得到的 `book` ,它是 Book 类的一个实例。这里所谓的实例,实际上就是先把所有的 _action_ 加一个 **$** 前缀放到一个空对象里,然后把发出的参数填充进去。等请求返回了,把除 _action_ 以外的成员删除掉,再把请求返回的数据填充到这个对象当中。所以,如果我们这样:
var book = Book.read({id: '123'}, function(response){
console.log(book);
});
console.log(book)
就能看到 `book` 实例的变化过程了。
现在我们得到一个真实的实例,看一下实例的调用过程:
//响应的数据是 {result: 0, msg: '', obj: {id: 'xxx'}}
var book = Book.create({title: '测试标题', author: '测试作者'}, function(response){
console.log(book);
});
可以看到,在请求回调之后, `book` 这个实例的成员已经被响应内容填充了。但是这里有一个问题,我们返回的数据,并不适合一个 book 实例。格式先不说,它把 `title` 和 `author` 这些信息都丢了(因为响应只返回了 `id` )。
如果仅仅是格式问题,我们可以通过配置 _$http_ 服务来解决( AJAX 请求都要使用 _$http_ 服务的):
$http.defaults.transformResponse = function(data){return angular.fromJson(data).obj};
当然,我们也可以自己来解决一下丢信息的问题:
var p = {title: '测试标题', author: '测试作者'};
var book = Book.create(p, function(response){
angular.extend(book, p);
console.log(book);
});
不过,始终会有一些不方便了。比较正统的方式应该是调节服务器端的响应,让服务器端也具有和前端一样的实例概念,返回的是完整的实例信息。即使这样,你也还要考虑格式的事。
现在我们得到了一个真实的 `book` 实例了,带有 `id` 信息。我们尝试一下实例的方法调用,先回过去头看一下那三种调用形式,对于实例只有第三种形式:
non-GET instance actions: instance.$action([parameters], [success], [error])
首先解决一个疑问,如果一个实例是进行一个 GET 的调用会怎么样?没有任何问题,这当然没有任何问题的,形式和上面一样。
如何实例是做 POST 请求的话,从形式上看,我们无法控制请求的 _postData_ ?是的,所有的 POST 请求,其 _postData_ 都会被实例数据自动填充,形式上我们只能控制 _params_ 。
所以,如果是在做修改调用的话:
book.$update({title: '新标题', author: '测试作者'}, function(response){
console.log(book);
});
这样是没有意义的并且错误的。因为要修改的数据只是作为 GET 参数传递了,而 `postData` 传递的数据就是当前实例的数据,并没有任何修改。
正确的做法:
book.title = '新标题'
book.$update(function(response){
console.log(book);
});
显然,这种情况下,回调都可以省了:
book.title = '新标题'
book.$update();
- Introduction
- 关于AngularJS
- 关于本文档
- 开始的例子
- 依赖注入
- 作用域
- 数据绑定与模板
- 数据->模板
- 模板->数据
- 数据->模板->数据->模板
- 模板
- 定义模板内容
- 内容渲染控制
- 节点控制
- 事件绑定
- 表单控件
- 模板中的过滤器
- 排序 orderBy
- 过滤列表 filter
- 其它
- 例子:表头排序
- 例子:搜索
- 锚点路由
- 路由定义
- 参数定义
- 业务处理
- 定义模板变量标识标签
- AJAX
- HTTP请求
- 广义回调管理
- 工具函数
- 上下文绑定
- 对象处理
- 类型判定
- 其它服务
- 日志
- 缓存
- 计时器
- 表达式函数化
- 模板单独使用
- 自定义模块和服务
- 模块和服务的概念与关系
- 定义模块
- 定义服务
- 引入模块并使用服务
- 附加模块 ngResource
- 使用引入与整体概念
- 基本定义
- 基本使用
- 定义和使用时的占位量
- 实例
- AngularJS与其它框架的混用(jQuery, Dojo)
- 自定义过滤器
- 自定义指令directive
- 指令的使用
- 指令的执行过程
- 基本的自定义方法
- 属性值类型的自定义
- Compile的细节
- transclude的细节
- 把节点内容作为变量处理的类型
- 指令定义时的参数
- Attributes的细节
- 预定义的 NgModelController
- 预定义的 FormController
- 示例:文本框
- 示例:模板控制语句 for
- 示例:模板控制语句 if/else