从服务器获取数据的推荐方法

Mis*_*ery 145 angularjs

在不使用的情况下,在AngularJS中连接到服务器数据源的建议方法是什么$resource.

$resource有很大的局限性,如:

  1. 没有使用适当的未来
  2. 不够灵活

Mis*_*ery 229

有些情况下,与后端通信时$资源可能不合适.这显示了如何在不使用资源的情况下设置$ resource之类的行为.

angular.module('myApp').factory('Book', function($http) {
  // Book is a class which we can use for retrieving and 
  // updating data on the server
  var Book = function(data) {
    angular.extend(this, data);
  }

  // a static method to retrieve Book by ID
  Book.get = function(id) {
    return $http.get('/Book/' + id).then(function(response) {
      return new Book(response.data);
    });
  };

  // an instance method to create a new Book
  Book.prototype.create = function() {
    var book = this;
    return $http.post('/Book/', book).then(function(response) {
      book.id = response.data.id;
      return book;
    });
  }

  return Book;
});
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器内你可以:

var AppController = function(Book) {
  // to create a Book
  var book = new Book();
  book.name = 'AngularJS in nutshell';
  book.create();

  // to retrieve a book
  var bookPromise = Book.get(123);
  bookPromise.then(function(b) {
    book = b;
  });
};
Run Code Online (Sandbox Code Playgroud)

  • @NathanBunney'Book.getAll = function(){return $ http.get('/ Book').then(function(response){var books = []; for(var i = 0; i <response.data.length ; i ++){books.push(新书(response.data [i]));}返回书籍;}); };" (4认同)
  • @NathanBunney,你可以让你的静态get方法循环遍历结果并构建一个Books数组. (2认同)
  • 你如何在控制器之间共享一本书?或书籍? (2认同)

tha*_*ote 26

我建议你使用$ resource.

它可能在下一版本的Angularjs中支持(url覆盖).然后你就可以像这样编码:

// need to register as a serviceName
$resource('/user/:userId', {userId:'@id'}, {
    'customActionName':    {
        url:'/user/someURI'
        method:'GET',
        params: {
            param1: '....',
            param2: '....',
        }
    },
     ....
});
Run Code Online (Sandbox Code Playgroud)

返回回调可以像这样在ctrl范围内处理.

// ctrl scope
serviceName.customActionName ({
    paramName:'param',
    ...
}, 
function (resp) {
    //handle return callback
}, 
function (error) {
    //handler error callback
});
Run Code Online (Sandbox Code Playgroud)

可能你可以处理更高抽象级别的代码.

  • 哈哈,你推荐的框架的实际创建者如何做某事:P (16认同)
  • 我的天啊!我感到很惭愧. (11认同)
  • 当前版本的angular.js支持$ resource模块中的url覆盖. (2认同)