2012-11-13 14 views
26

मैं एक गैर-RESTful तरह से मेरे संग्रह प्राप्त करना चाहते हैं, तो मैंओवरराइड बैकबोन के संग्रह-फ़ेच

App.carClc = Backbone.Collection.extend({ 
    model : App.cardModel, 
    url : 'http://localhost/bbtest/data.php', 
    fetch : function() { 
     $.ajax({ 
      type : 'GET', 
      url : this.url, 
      success : function(data) { 
       console.log(data); 
      } 
     }); 
    } 
}); 

Collection.fetch साथ मैं प्रतिक्रिया करने के लिए अपने संग्रह सेट करने के लिए पता नहीं कैसे ओवरराइड करने के लिए निर्णय लेते हैं। मैं बैकबोनजेएस के लिए नया हूं, आप सभी को धन्यवाद!

+0

मुझे यह नहीं मिला। अपना खुद का $ .ajax क्यों लिखें? fetch इसे अपने कोड के बिना एक ही तरीके से करते हैं!?! .. – Moszeed

+6

सर्वर-साइड की शैली रीस्टफुल –

उत्तर

56

आप fetch के लिए एक कस्टम "डेकोरेटर" जोड़ना चाहते हैं, लेकिन यह पूरी तरह से हावी नहीं, कोशिश:

var MyCollection = Backbone.Collection.extend({ 

     //custom methods 

     fetch: function(options) { 

      //do specific pre-processing 

      //Call Backbone's fetch 
      return Backbone.Collection.prototype.fetch.call(this, options); 
     } 

    });  

यहाँ, आप शुरू करने की जरूरत नहीं है अपने स्वयं के $.ajax

इसके अलावा, अंतिम पंक्ति में return मत भूलना आप jQuery वादा रीढ़ की fetch विधि द्वारा दिया उपयोग करना चाहते हैं।

अधिक जानकारी के लिए http://japhr.blogspot.in/2011/10/overriding-url-and-fetch-in-backbonejs.html देखें।

+5

यह उत्तर मुझे और अधिक साफ महसूस करता है, और आपको किसी भी अन्य सुविधाओं से खुद को सीमित नहीं करने देता है। फ़ेच() में आप बाद में उपयोग करना चाहेंगे। –

+0

यह सही ढंग से कॉल और मॉडल नहीं बनाएगा। – htmldrum

+2

@ जेआरएम क्या आप विस्तार कर सकते हैं? – briangonzalez

3

मैं कुछ इस तरह उपयोग कर रहा हूँ:

$.when($.ajax(URL, { dataType: "json" })) 
    .then($.proxy(function(response) { 
      ctx.view.collection.reset(response);        
    },ctx)); 

मुख्य बिंदु beeing मैं collection.reset(data) का उपयोग संग्रह reinitialize करने के लिए

+1

बस एक नाइटपिकिंग बिंदु नहीं है। $ .ajax एक वादा नहीं है, और इसलिए ऊपर दिए गए कोड को $ के बाहर फिर से बताया जा सकता है।(), I.e .: $ .ajax (...)। फिर (...), ठीक काम करना चाहिए? हालांकि संग्रह पर अच्छा काम है। – seebiscuit

30

बैकबोन संग्रह सेट करने के लिए नए डेटा जोड़ सकते हैं और रीसेट दो विधियों है। मान लीजिए कि आप आने वाले डेटा के साथ सभी संग्रह डेटा की जगह और रीसेट का उपयोग की वजह करना चाहते हैं:

App.carClc = Backbone.Collection.extend({ 
model : App.cardModel, 
url : 'http://localhost/bbtest/data.php', 
fetch : function() { 
    // store reference for this collection 
    var collection = this; 
    $.ajax({ 
     type : 'GET', 
     url : this.url, 
     dataType : 'json', 
     success : function(data) { 
      console.log(data); 
      // set collection data (assuming you have retrieved a json object) 
      collection.reset(data) 
     } 
    }); 
} 
}) 
+0

आपको बहुत बहुत धन्यवाद। –

+0

collection.reset (डेटा), घंटों के लिए खोज – max4ever

2

आप लाने रखने के लिए वादों के लिए "thenable" चाहते हैं तो आप भी कुछ इस तरह कर सकता है:

fetch: function() { 
    var self = this, 
     deferred = new $.Deferred(); 

    $.get(this.url).done(function(data) { 
      // parse data 
     self.reset({parsed data}); 
     deferred.resolve(); //pass in anything you want in promise 
    }); 
    return deferred.promise(); 
} 
0

आप हर मॉडल और/या संग्रह के लिए यह करने के लिए की जरूरत है, Backbone.ajax ओवरराइड।

ओवरराइडिंग Backbone.ajax आपको options का अनुरोध देता है जो आमतौर पर $.ajax पर भेजा जाएगा। आपको केवल $.ajax (या कुछ अन्य Promise) की प्रतिक्रिया वापस करने की आवश्यकता है और संग्रह/मॉडल में सामान सेट करने के बारे में चिंता करने की आवश्यकता नहीं है।

संबंधित मुद्दे