基本使用

最后更新于:2022-04-01 22:40:12

### 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();
';