Рекомендуемый способ получения данных с сервера


145

Каков рекомендуемый способ подключения к источникам данных сервера в AngularJS без использования $resource.

$resourceИмеет много ограничений , таких как:

  1. Не используя правильное будущее
  2. Не достаточно гибок

6
Правда ли, что у $ resource есть ограничение на использование не надлежащего будущего, учитывая, что эта проблема (https://github.com/angular/angular.js/issues/415) закрыта? (Я новичок в Angular, извиняюсь, если вопрос сбивает с толку.) РЕДАКТИРОВАТЬ - Этот коммит ( github.com/angular/angular.js/commit/… ) также, похоже, предполагает, что $ resource может не иметь такого ограничения больше?
Джейсон Сайдс

1
ну, это законно здесь, чтобы ответить на ваши собственные вопросы .. ладно? нажмите «Задать вопрос», это называется «поделиться своими знаниями»
holms

Ответы:


229

Бывают случаи, когда $ resource может не подходить для общения с бэкендом. Здесь показано, как настроить поведение $ 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;
});

Тогда внутри вашего контроллера вы можете:

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;
  });
};

1
Может быть, вопрос нуб, но как можно расширить это, чтобы получить get (), который возвращал несколько ответов, а не один ответ?
Нейт Банни

2
@NathanBunney, ваш статический метод get, приведенный выше, может перебрать результаты и создать массив книг.
Бен Леш

4
@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]));} вернуть книги;}); };»
Яир Невет

2
Как бы вы поделились bookили коллекции books между контроллерами?
Лукас

1
Это здорово (очевидно, с тех пор как Миско создал фреймворк), но я изо всех сил пытаюсь понять, как сделать его многоразовым. Если бы я хотел реализовать функции CRUD только один раз, а затем унаследовать их функциональность на дочерних фабриках / сервисах, которые нуждались только в аргументе urlBase (желательно, сохраненном в прототипе, чтобы каждому экземпляру не требовалась новая копия urlBase), как бы Я делаю это?
Дин Стамлер,

26

Я рекомендую вам использовать $ resource .

Он может поддерживать (переопределение URL) в следующей версии Angularjs. Тогда вы сможете кодировать так:

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

И обратные обратные вызовы могут быть обработаны в области видимости ctrl следующим образом.

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

Вероятно, вы можете обрабатывать код на более высоком уровне абстракции.


2
Текущая версия angular.js поддерживает переопределение URL в модуле $ resource.
Благодарность

16
Ха-ха, вы рекомендуете фактическому создателю фреймворка о том, как что-то сделать: P
HeberLZ

11
О, МОЙ БОГ! Мне так стыдно.
Благодарность
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.