2011-08-17 13 views
10

मेरे पास एक ऐसा एप्लिकेशन है जिसमें बैकबोन.जेएस संग्रह और सर्वर से रीयल-टाइम कनेक्शन शामिल है।पुराने मॉडल को पोंछे बिना बैकबोन.जेएस संग्रह को अपडेट करना

प्रत्येक बार कोई भी ग्राहक संग्रह में मॉडल को जोड़/हटा/अपडेट करता है, अद्यतन संग्रह अन्य सभी ग्राहकों (डेल्टा नहीं, संपूर्ण संग्रह) पर प्रसारित किया जाता है।

अन्य अद्यतनों से इस अद्यतन ईवेंट को संभालने के दौरान, संग्रह को अपडेट करने का एकमात्र तरीका एक रीसेट() है। दुर्भाग्यवश, यह पुराने मॉडल को मिटा देता है और सभी दृश्य-संबंधित दुष्प्रभावों के साथ-साथ नए बनाता है।

क्या ऐसे संग्रह को अद्यतन करने का बैकबोन-स्वीकृत तरीका है जो मूल मॉडल (आईडी द्वारा तुलना) को बनाए रखता है और अपडेट करता है, केवल आवश्यक होने पर उन्हें बना/हटा देता है?

अद्यतन बैकबोन ने Collection.set विधि जोड़ा है, जो मौजूदा मॉडल को अपडेट करने में सक्षम है।

+0

संबंधित: https://github.com/documentcloud/backbone/issues/955 – philfreo

उत्तर

8

समाधान मैं के साथ चला गया है:

Backbone.Collection.prototype.update = function(colIn){ 

    var ids = []; 

    _(colIn).each(function(modIn){ 
    var existing = this.get(modIn); 
    // update existing models 
    if (existing) { existing.set(modIn); } 
    // add the new ones 
    else { this.add(modIn); } 

    ids.push(modIn.id); 
    }, this); 

    // remove missing models (optional) 
    var toRemove = this.reject(function(model){ 
    return _(ids).include(model.id); 
    }); 

    this.remove(toRemove); 
    return this; 
}; 
+2

ग्रेट। बस एक चीज ... अंत में 'इसे वापस करें;' जोड़ें। बैकबोन विधियां हमेशा उनके संदर्भ ऑब्जेक्ट को वापस कर देती हैं ताकि आप उन्हें चेन कर सकें ('my_col.update (x) .toJSON()')। – Jake

+0

हो गया। धन्यवाद, जेक। –

0

जब आप संग्रह में मॉडल जोड़ते हैं तो 'एड' कॉलबैक लागू किया जाता है। रीसेट करने के बजाय इसका उपयोग करें।

+1

यदि केवल डेल्टा राज्य को परिवर्तन पर प्रसारित किया गया था (उदाहरण के लिए 'मॉडल ए जोड़ा/हटाया/अपडेट किया गया'), यह सही समाधान होगा। हालांकि, पूरे संग्रह को एक समय में एक के बजाय पुन: प्रसारित किया जाता है, इसलिए सवाल यह है कि मौजूदा मॉडलों के मूल उदाहरणों को कैसे बनाए रखा जाए। –

0

आप संग्रह के add विधि का विस्तार करने और मॉडल अस्तित्व के लिए वहाँ की जांच कर सकते

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