AngularJS学习笔记

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 实例。格式先不说,它把 titleauthor 这些信息都丢了(因为响应只返回了 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();