2012-09-05 2 views
16

मैं एक jquery & backbone.js वेब ऐप विकसित करता हूं।
एक घटक में एक HTML तालिका है और इस तालिका के पीछे एक backbone.js संग्रह है।
इस संग्रह में कोई परिवर्तन एचटीएमएल तालिका के एक अद्यतन करने के लिए नेतृत्व करना चाहिए, तो मैंbackbone.js संग्रह घटनाएं

this.collection.bind("reset add remove", this.renderRows, this);  

बारे में तो मैं HTML तालिका, जब पूरे संग्रह नया हो जाता है, जब एक नया मॉडल जोड़ा जाता है और जब एक अद्यतन मॉडल हटा दिया जाता है।

एक विस्तृत दृश्य घटक भी है जिसे उपयोगकर्ता बुलाता है और HTML तालिका की एक निश्चित पंक्ति पर क्लिक करता है। इस घटक की शुरुआत में मैं उपयोगकर्ता के बाद कुछ विशेषताओं बदल गया है संग्रह से बाहर

changeModel = this.collection.get(id); 

सही मॉडल मिलता है, मैं

changeModel.set(attrs); 

करते हैं और एचटीएमएल मेज पर वापस जाएँ। संग्रह में मॉडल में सही बदले गए मान हैं।

लेकिन एचटीएमएल तालिका अपडेट नहीं की गई है क्योंकि 3 घटनाओं में से कोई भी नहीं (रीसेट, एड, हटाएं) ट्रिगर किया गया था।

तो मैं संग्रह

this.collection.bind("replace reset add remove", this.renderRows, this); 

बंधन को जोड़ा गया "की जगह" और विस्तार देखने से लौटने से पहले मैं

this.collection.trigger("replace"); 

कहा जाता है मेरे समाधान काम करता है, लेकिन मेरे सवाल यह है:

क्या कोई "मूल" बैकबोन.जेएस समाधान है जो पहले से ही है और मैं चूक गया हूं और जहां मुझे अपने आप से कुछ ट्रिगर नहीं करना है?

उत्तर

46

change संग्रह से लेकर मॉडल तक बुलबुले की घटनाएं। (संग्रह के annotated source में _onModelEvent समारोह। विधि सिर्फ मूल रूप से सभी घटनाओं मॉडल से लेता है और संग्रह पर उन्हें चलाता है।

इस ओर जाता है

  1. को मॉडल विशेषता सेट कर दिया जाता
  2. मॉडल से चलाता है change
  3. संग्रह कैच change
  4. संग्रह ट्रिगर्स change

तो

this.collection.bind("replace reset add remove", this.renderRows, this); 

इस

this.collection.bind("change reset add remove", this.renderRows, this); 

आशा इस में मदद करता है के साथ प्रतिस्थापित किया गया है!

पीएस

मेरी व्यक्तिगत राय यह है कि यदि केवल एक मॉडल बदल जाता है तो आपको पूरी तालिका को फिर से नहीं लेना चाहिए।इसके बजाय प्रत्येक तालिका पंक्ति को अपने आप में एक दृश्य बनाएं जिसमें उसके मॉडल के समान मॉडल है और उसके बाद विशेषता परिवर्तनों पर प्रतिक्रिया दें। यदि आप केवल एक को लक्षित कर रहे हैं तो 500 टेबल कक्षों को फिर से निकालने में कोई बात नहीं है।

अद्यतन

और आजकल आप घटनाओं के लिए बाध्य के लिए on -method उपयोग करना चाहिए।

collection.on("change reset add remove", this.renderRows, this); 

आप बी बी 1.0 का उपयोग कर रहे हैं, और इस घटना के एक View भीतर की बात सुनी जा रही है, मैं नए listenTo उपयोग करने के लिए घटनाओं हैं, जिनका प्रयोग view.remove() बुला आसान unbinding के लिए अनुमति देता में बाध्य करने के लिए आगे बढ़ सुझाव देते हैं। उस स्थिति में आपको करना चाहिए:

// assuming this is the view 
this.listenTo(collection, "change reset add remove", this.renderRows); 
+4

धन्यवाद। मुझे लगता है कि आपको मूल उत्तर का प्रस्ताव देना चाहिए जैसे कि "बैकबोन ने कुछ सुविधाएं जोड़ दी हैं क्योंकि मैंने पहली बार यह लिखा है, अगर आप हाल ही में बैकबोन का उपयोग कर रहे हैं, तो नीचे अपडेट देखें।" 20 या तो उत्तर की तरह दिखने वाली रेखाएं हम में से कुछ के लिए ध्यान अवधि की सीमा के करीब है। फिर से धन्यवाद, सहायक। –

+0

सहमत "अद्यतन" शीर्ष पर होना चाहिए, लेकिन वे वास्तव में स्पष्टीकरण और कोड की 20 पंक्तियों को स्वरूपित करते थे, मुझे इसके माध्यम से पढ़ने में कोई समस्या नहीं थी। – Gal

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

  • कोई संबंधित समस्या नहीं^_^