Sunucudan veri almanın önerilen yolu


145

Kullanmadan AngularJS'deki sunucu veri kaynaklarına bağlanmanın önerilen yolu nedir $resource?

Aşağıdaki $resourcegibi birçok sınırlaması vardır:

  1. Uygun vadeli işlemleri kullanmamak
  2. Yeterince esnek olmamak

6
Bu sorunun (https://github.com/angular/angular.js/issues/415) kapatılması nedeniyle $ resource'un uygun vadeli işlemleri kullanmama sınırlaması olduğu hala doğru mu? ( Angular'da yeniyim , soru kafa karıştırıcıysa özür dilerim.) DÜZENLE - Bu kayıt ( github.com/angular/angular.js/commit/… ) ayrıca $ resource'un artık bu sınırlamaya sahip olmayabileceğini gösteriyor gibi görünüyor?
Jason Sydes

1
Peki burada kendi sorularınızı yanıtlamak yasal ..ok? "Bilginizi paylaşın" denen "Soru Sor" düğmesine basın
holms

Yanıtlar:


229

Arka uçla konuşurken $ resource'un uygun olmadığı durumlar vardır. Bu, kaynak kullanmadan $ resource benzeri davranışın nasıl ayarlanacağını gösterir.

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

Ardından kontrol cihazınızın içinde şunları yapabilirsiniz:

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
Belki bir noob sorusu ama bu, yalnızca tek bir yanıt değil, birden çok yanıt döndüren bir get () için nasıl genişletilebilir?
Nate Bunney

2
@NathanBunney, yukarıdaki statik alma yönteminizin sonuçları arasında döngü oluşturabilir ve bir Kitap dizisi oluşturabilirsiniz.
Ben Lesh

4
@NathanBunney 'Book.getAll = function () {return $ http.get (' / Book '). Sonra (function (response) {var books = []; for (var i = 0; i <response.data.length ; i ++) {books.push (yeni Kitap (response.data [i]));} kitapları döndür;}); }; '
Yair Nevet

2
Denetleyiciler arasında bir bookveya bir dizi e- postayı nasıl paylaşırsınız book?
Lukas,

1
Bu harika (açıkçası çerçeveyi Misko oluşturduğundan beri), ancak onu nasıl yeniden kullanılabilir hale getireceğimi bulmaya çalışıyorum. CRUD işlevlerini yalnızca bir kez uygulamak ve ardından işlevlerini yalnızca bir urlBase argümanına ihtiyaç duyan alt fabrikalarda / hizmetlerde devralmak isteseydim (tercihen prototipte depolanır, böylece her bir örnek urlBase'in yeni bir kopyasına ihtiyaç duymazdı), nasıl olurdu Bunu yaparım?
Dekan Stamler

26

$ Resource kullanmanızı tavsiye ederim .

Angularjs'in sonraki sürümünde (url geçersiz kılma) destekleyebilir. O zaman şu şekilde kodlama yapabileceksiniz:

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

Ve dönüş geri aramaları bu şekilde ctrl kapsamında ele alınabilir.

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

Muhtemelen kodu daha yüksek soyutlama seviyesinde idare edebilirsiniz.


2
Angular.js'nin mevcut sürümü, $ resource modülünde url geçersiz kılmayı destekler.
2013

16
Haha, bir şeyin nasıl yapılacağına dair çerçevenin gerçek yaratıcısını öneriyorsunuz: P
HeberLZ

11
AMAN TANRIM! Çok utanıyorum
58'e teşekkür notu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.