2012-11-10 14 views
5

मेरे बैकबोन.जेएस आधारित ऐप में मैं अपने एपीआई से बात कर रहा हूं जो एक संग्रह के अनुरोध में 204 स्थिति और खाली निकाय के साथ प्रतिक्रिया करता है जिसमें शामिल नहीं है अभी तक कोई डेटा मेरी राय में इस तरह के मामले में एक विश्वसनीय API को जवाब देना चाहिए।बैकबोन.जेएस संग्रह अनुरोध में 204 प्रतिक्रिया को कैसे संभालें

मेरे ऐप में अब मुझे समस्या है, जाहिर है कि 204 प्रतिक्रिया प्राप्त होने के बाद कोई घटना ट्रिगर नहीं हुई है। मैं reset और तरह all बाध्य करने की कोशिश की:

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection; 
    this.collection.bind('reset', this.render, this); 
    this.collection.bind('all', this.render, this); 
    return this.collection.fetch(); 
    }; 

लेकिन घटनाओं कभी सक्रिय नहीं। तो मैंने कुछ कॉलबैक लाने की कोशिश की:

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection(); 
    return this.collection.fetch({ 
     success: function(a, b, c) { 
     debugger; 
     }, 
     error: function(a, b, c) { 
     debugger; 
     }, 
     complete: function(a, b) { 
     debugger; 
     } 
    }); 
    }; 

वही व्यवहार। प्रतिक्रिया 204 के मामले में कोई डीबग स्टेटमेंट कभी नहीं पहुंचा है। मैं 204 प्रतिक्रियाओं को कैसे संभाल सकता हूं? क्या मुझे sync में खोदना होगा और 204 के लिए अतिरिक्त हैंडलिंग जोड़ना होगा या बैकबोन में कुछ ऐसा है जिसे मैं अभी तक नहीं जानता?

Thx फेलिक्स

+0

जहां तक ​​मुझे पता चला, मैं कुछ करने के लिए लॉग इन संग्रहों विधि पार्स जोड़ सकते हैं। लेकिन वहां से 'नो-कंटेंट' व्यू के प्रतिपादन को संभालना बदसूरत लगता है। – GeorgieF

+2

मुझे एक ऐसा समाधान मिला जो कम से कम थोड़ा अधिक सुरुचिपूर्ण लगता है। मैं अपने संग्रह में पार्स परिभाषित करता हूं। अंदर मैं जांचता हूं कि दी गई प्रतिक्रिया खाली है या नहीं। यदि ऐसा है, तो मैंने संग्रह मॉडल को [] पर सेट किया है जो बदले में रीसेट ईवेंट को ट्रिगर करता है। संग्रह दृश्य उस घटना से जुड़ा हुआ है और बाद में कुछ "यहां कोई सामग्री नहीं" टेम्पलेट प्रस्तुत कर सकता है। – GeorgieF

उत्तर

0

समाधान एक ही समय में बहुत आगे और अजीब लगता है:

मैं बस मेरे संग्रह में parse विधि को परिभाषित इतना है कि यह जाँच करता है, चाहे पारित कर दिया प्रतिक्रिया ऑब्जेक्ट खाली है। यही वह मामला है जब 204 का सामना हुआ। फिर parse के अंदर मैंने this.collection.models = [] सेट किया जो reset ईवेंट ट्रिगर करता है। संग्रह दृश्य उस घटना से जुड़ा हुआ है, एक फ़ंक्शन चलाता है जो this.collection.models के अंदर एक नज़र रख सकता है। यदि कोई मॉडल नहीं दिया जाता है, तो मानक टेम्पलेट के बजाय 'नो-कंटेंट' टेम्पलेट प्रस्तुत किया जा सकता है।

अगर किसी के पास बेहतर दृष्टिकोण है, तो मैं यहां इसकी सराहना करता हूं!

0

Backbone.js खाली संग्रह में ऐसे प्रतिक्रियाओं को लपेटता है। मैं इसे वर्कअराउंड के रूप में उपयोग कर रहा हूं।

render: function(){ 
    if (this.collection.length == 0) { 
     console.log('empty response'); 
     // initialize with default values 
     this.collection.reset(data); 
    } 
    // do usual stuff 
} 
0

आज भी यही समस्या आई है, और निष्कर्ष से कहें, मेरा कोड गलत था। कोड को संशोधित करने के बाद, success() कॉलबैक को कॉल किया गया था जब सर्वर 204 No Content के साथ प्रतिक्रिया करता है।

रीढ़: 1.2.3
jQuery: 2.1.4

गलत कोड:

FooCollection = Backbone.Collection.extend({ 
    url: '/foo', 

    model: FooModel, 

    fetch: function (options) { 

    // do something. 

    // Actually, you should call `Backbone.Collection.prototype.fetch()`. 
    return Backbone.Model.prototype.fetch.call(this, options); 
    } 
}); 

तो, अगर आप इस समस्या का अनुभव है, तो आप अगर वहाँ में किसी भी त्रुटि है की जाँच करनी चाहिए कोड। वैसे भी, यदि आप 204 No Content प्रतिक्रिया को संभालना चाहते हैं, तो निम्न विधि है। (अनुशंसित नहीं)

initialize: function() { 
    this.collection = new FooCollection(); 

    var _this = this; 
    this.collection.fetch({ 
     success: function (collection, response, options) { 
     }, 
     error: function (collection, response, options) { 
     } 
    }).done(function (data, textStatus, jqXHR) { 
     if (jqXHR.status === 204) { 
     // do something. 
     // e.g. _this.collection.reset(); 
     } 
    }); 
    } 
संबंधित मुद्दे