Cara yang disarankan untuk mendapatkan data dari server

145

Apa cara yang disarankan untuk terhubung ke sumber data server di AngularJS tanpa menggunakan $resource.

Ada $resourcebanyak keterbatasan seperti:

  1. Tidak menggunakan futures yang tepat
  2. Tidak cukup fleksibel
Misko Hevery
sumber
6
Benarkah $ resource memiliki batasan untuk tidak menggunakan futures yang tepat mengingat masalah ini (https://github.com/angular/angular.js/issues/415) telah ditutup? (Saya baru mengenal Angular, permintaan maaf saya jika pertanyaannya membingungkan.) EDIT - Komit ini ( github.com/angular/angular.js/commit/… ) juga tampaknya menyarankan bahwa $ resource mungkin tidak memiliki batasan itu lagi?
Jason Sydes
1
baik itu legal di sini untuk menjawab pertanyaan Anda sendiri .. ok? tekan "Ajukan Pertanyaan", itu disebut "berbagi pengetahuan Anda"
holms

Jawaban:

229

Ada beberapa kasus ketika $ resource mungkin tidak sesuai ketika berbicara dengan backend. Ini menunjukkan cara mengatur perilaku seperti sumber daya $ tanpa menggunakan sumber daya.

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

Kemudian di dalam controller Anda, Anda dapat:

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;
  });
};
Misko Hevery
sumber
1
Mungkin pertanyaan noob, tetapi bagaimana orang akan memperluas ini untuk mendapatkan get () yang mengembalikan beberapa respons bukan hanya satu respons?
Nate Bunney
2
@NathanBunney, Anda bisa meminta metode get statis Anda di atas melalui hasil dan membangun array Buku.
Ben Lesh
4
@NathanBunney 'Book.getAll = function () {return $ http.get (' / Book '). Lalu (function (response) {var books = []; for (var i = 0; i <response.data.length ; i ++) {books.push (Buku baru (response.data [i]));} mengembalikan buku;}); }; '
Yair Nevet
2
Bagaimana Anda berbagi bookatau koleksi bookantara pengendali?
Lukas
1
Ini bagus (jelas sejak Misko menciptakan kerangka kerja), tapi saya berjuang untuk mencari cara membuatnya bisa digunakan kembali. Jika saya ingin mengimplementasikan fungsi CRUD hanya sekali dan kemudian mewarisi fungsi mereka di pabrik anak / layanan yang hanya membutuhkan argumen urlBase (lebih disukai disimpan pada prototipe sehingga setiap instance tidak memerlukan salinan baru dari urlBase), bagaimana Saya melakukannya?
Dean Stamler
26

Saya sarankan Anda menggunakan $ resource .

Ini mungkin mendukung (url override) dalam versi Angularjs berikutnya. Maka Anda akan dapat kode seperti ini:

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

Dan mengembalikan callback dapat ditangani dalam lingkup ctrl seperti ini.

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

Mungkin Anda dapat menangani kode pada level abstraksi yang lebih tinggi.

terima kasihcatatan
sumber
2
Versi angular.js saat ini mendukung penggantian url dalam modul $ resource.
terima kasih catatan
16
Haha Anda merekomendasikan pembuat kerangka yang sebenarnya tentang cara melakukan sesuatu: P
HeberLZ
11
OH TUHAN! Saya merasa sangat malu.
terima kasih catatan