सर्वर से डेटा प्राप्त करने का अनुशंसित तरीका


145

उपयोग किए बिना AngularJS में सर्वर डेटा स्रोतों से कनेक्ट करने के लिए अनुशंसित तरीका क्या है $resource

$resourceइस तरह के रूप में कई सीमाएँ हैं:

  1. उचित वायदा का उपयोग नहीं करना
  2. पर्याप्त लचीला नहीं हो रहा है

6
क्या यह अभी भी सही है कि $ संसाधन में दिए गए उचित फ्यूचर्स का उपयोग नहीं करने की सीमा है क्योंकि यह मुद्दा (https://github.com/angular/angular.js/issues/415) बंद कर दिया गया है? (अगर सवाल उलझा हुआ है तो मैं एंगुलर हूं, अपनी माफी चाहता हूं।) EDIT - इस कमिट ( github.com/angular/angular.js/commit/… ) से भी लगता है कि $ रिसोर्स में अब वह सीमा नहीं हो सकती है?
जेसन सिड्स

1
अच्छी तरह से यहाँ अपने खुद के सवालों के जवाब देने के लिए कानूनी है ..ok? प्रेस, कि "अपने ज्ञान का हिस्सा" कहा जाता है "प्रश्न पूछें"
Holms

जवाबों:


229

ऐसे मामले हैं जब बैकएंड पर बात करते समय $ संसाधन उचित नहीं हो सकते हैं। यह दिखाता है कि संसाधन का उपयोग किए बिना $ संसाधन को व्यवहार में कैसे सेट किया जाए।

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
हो सकता है कि एक नॉब सवाल हो, लेकिन एक को पाने के लिए अनुमति देने के लिए कोई इसे कैसे बढ़ाएगा () जिसने कई प्रतिक्रियाएं दीं, केवल एक प्रतिक्रिया नहीं?
नैट बनी

2
@NathanBunney, आप परिणामों के माध्यम से लूप के ऊपर अपनी स्थैतिक विधि प्राप्त कर सकते हैं और पुस्तकों की एक सरणी का निर्माण कर सकते हैं।
बेन लेश

4
@NathanBunney 'Book.getAll = function () {$ $ http.get (' / पुस्तक ') फिर (फ़ंक्शन (प्रतिक्रिया) {var पुस्‍तकें [[]; के लिए (var i = 0; i <response.data.length ; i ++) {books.push (नई पुस्तक (response.data [i]));} पुस्तकें वापस करें;}); }; '
यैर नेवेट

2
आप नियंत्रकों के बीच एस का एक bookया संग्रह कैसे साझा करेंगे book?
लुकास

1
यह बहुत अच्छा है (जाहिर है जब से मिस्को ने रूपरेखा बनाई है), लेकिन मैं यह पता लगाने के लिए संघर्ष कर रहा हूं कि इसे कैसे पुन: प्रयोज्य बनाया जाए। अगर मैं CRUD के कार्यों को केवल एक बार लागू करना चाहता था और फिर बाल कारखानों / सेवाओं में उनकी कार्यक्षमता को विरासत में प्राप्त करता था, जिसे केवल urlBase तर्क की आवश्यकता थी (अधिमानतः प्रोटोटाइप पर संग्रहीत ताकि प्रत्येक उदाहरण को urlase की नई प्रतिलिपि की आवश्यकता न हो), कैसे मैं ऐसा करता हूँ?
डीन स्टैमलर

26

मेरा सुझाव है कि आप $ संसाधन का उपयोग करें

यह Angularjs के अगले संस्करण में (url ओवरराइड) का समर्थन कर सकता है। तब आप इस तरह से कोड कर सकेंगे:

// 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 ओवरराइड का समर्थन करता है।
धन्यवाद

16
Haha आप फ्रेमवर्क के वास्तविक निर्माता की सिफारिश कर रहे हैं कि कैसे कुछ करना है: P
HeberLZ

11
हे भगवान! मुझे बहुत शर्म आती है।
शुक्रिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.