यह एक बड़ा सवाल है। बैकबोन महान है क्योंकि यह मान्यताओं की कमी के कारण होता है, लेकिन इसका मतलब यह है कि आपको खुद को इस तरह की चीजों को लागू करना है (कैसे तय करें)। अपने स्वयं के सामान के माध्यम से देखने के बाद, मुझे लगता है कि मैं (तरह का) परिदृश्य 1 और परिदृश्य 2 के मिश्रण का उपयोग करता हूं। मुझे नहीं लगता कि एक 4 वां जादुई परिदृश्य मौजूद है, क्योंकि बस, पर्याप्त है, जो कुछ भी आप परिदृश्य 1 और 2 में करते हैं। किया हुआ।
मुझे लगता है कि यह स्पष्ट करना आसान होगा कि मैं इसे एक उदाहरण के साथ कैसे संभालना चाहता हूं। कहो कि मेरे पास यह सरल पृष्ठ निर्दिष्ट विचारों में टूट गया है:
कहो HTML है, गाया जाने के बाद, कुछ इस तरह:
<div id="parent">
<div id="name">Person: Kevin Peel</div>
<div id="info">
First name: <span class="first_name">Kevin</span><br />
Last name: <span class="last_name">Peel</span><br />
</div>
<div>Phone Numbers:</div>
<div id="phone_numbers">
<div>#1: 123-456-7890</div>
<div>#2: 456-789-0123</div>
</div>
</div>
उम्मीद है कि यह बहुत स्पष्ट है कि HTML आरेख के साथ कैसे मेल खाता है।
ParentView
2 बच्चे दृश्य, रखती है InfoView
और PhoneListView
साथ ही साथ कुछ अतिरिक्त divs, जिनमें से एक, #name
, कुछ बिंदु पर निर्धारित करने की आवश्यकता। PhoneListView
अपने स्वयं के बच्चे के विचारों को रखता है, PhoneView
प्रविष्टियों की एक सरणी ।
तो अपने वास्तविक प्रश्न पर। मैं शुरुआती प्रकार को देखता हूं और दृश्य प्रकार के आधार पर अलग-अलग प्रतिपादन करता हूं। मैं अपने विचारों को दो प्रकारों, Parent
विचारों और Child
विचारों में तोड़ता हूं ।
उनके बीच का अंतर सरल है, Parent
विचार बच्चे के विचारों को Child
रखते हैं जबकि विचार नहीं करते हैं। तो मेरी उदाहरण में, ParentView
और PhoneListView
कर रहे हैं Parent
, विचार करते हुए InfoView
और PhoneView
प्रविष्टियों Child
बार देखा गया।
जैसा कि मैंने पहले उल्लेख किया है, इन दो श्रेणियों के बीच सबसे बड़ा अंतर है जब उन्हें रेंडर करने की अनुमति दी जाती है। एक आदर्श दुनिया में, मैं Parent
केवल एक बार प्रस्तुत करना चाहता हूं । मॉडल (नों) में बदलाव होने पर किसी भी री-रेंडरिंग को संभालना उनके बच्चे के विचारों पर निर्भर करता है। Child
दूसरी ओर, मैं किसी भी समय उन्हें फिर से प्रस्तुत करने की अनुमति देता हूं क्योंकि उनके पास उन पर भरोसा करने वाले कोई अन्य विचार नहीं हैं।
कुछ और बातें करने के लिए Parent
मेरे initialize
कार्यों को पसंद करने वाले विचारों के लिए, थोड़ा और विस्तार से :
- मेरे अपने दृष्टिकोण को आरम्भिक करें
- मेरे अपने विचार प्रस्तुत करें
- किसी भी बच्चे के विचार बनाएं और आरंभ करें।
- असाइन करें कि प्रत्येक बच्चे को मेरे विचार में एक तत्व दिखाई देता है (जैसे
InfoView
असाइन किया जाएगा #info
)।
चरण 1 बहुत आत्म व्याख्यात्मक है।
चरण 2, प्रतिपादन, ऐसा किया जाता है कि बच्चे द्वारा देखे जाने से पहले ही कोई भी तत्व जिस पर भरोसा करता है, वह पहले से ही मौजूद है। ऐसा करने से, मुझे पता है कि सभी बच्चे events
सही ढंग से सेट हो जाएंगे, और मैं उनके ब्लॉकों को कई बार फिर से प्रस्तुत कर सकता हूं, जैसा कि मैं चाहता हूं कि किसी भी चीज को फिर से सौंपने की चिंता किए बिना। मैं वास्तव में यहां render
किसी भी बच्चे के विचार नहीं करता हूं , मैं उन्हें अपने भीतर ऐसा करने की अनुमति देता हूं initialization
।
चरण 3 और 4 वास्तव में उसी समय को संभाला जाता है जब मैं el
बच्चे को देखने के दौरान पास करता हूं । मुझे यहां एक तत्व पास करना पसंद है क्योंकि मुझे लगता है कि माता-पिता को यह निर्धारित करना चाहिए कि अपने स्वयं के दृश्य में बच्चे को अपनी सामग्री डालने की अनुमति कहां है।
प्रतिपादन के लिए, मैं इसे Parent
विचारों के लिए बहुत सरल रखने की कोशिश करता हूं । मैं चाहता हूं कि render
फंक्शन पैरेंट व्यू को रेंडर करने से ज्यादा कुछ नहीं करे। कोई घटना प्रतिनिधि, बच्चे के विचारों का कोई प्रतिपादन, कुछ नहीं। बस एक साधारण रेंडर।
हालांकि यह हमेशा काम नहीं करता है। उदाहरण के लिए ऊपर मेरे उदाहरण में, #name
तत्व को किसी भी समय मॉडल परिवर्तन के नाम से अपडेट करना होगा। हालाँकि, यह ब्लॉक ParentView
टेम्प्लेट का हिस्सा है और एक समर्पित Child
दृश्य द्वारा नियंत्रित नहीं किया जाता है , इसलिए मैं इसके चारों ओर काम करता हूं। मैं कुछ प्रकार के subRender
फ़ंक्शन बनाऊंगा जो केवल#name
तत्व की सामग्री को प्रतिस्थापित करता है , और पूरे #parent
तत्व को कचरा नहीं करना पड़ता है । यह एक हैक की तरह लग सकता है, लेकिन मैंने वास्तव में पाया है कि यह पूरे डोम और रीटचिंग तत्वों और इस तरह के पुन: प्रतिपादन के बारे में चिंता करने से बेहतर काम करता है। अगर मैं वास्तव में इसे साफ करना चाहता था, तो मैं एक नया Child
दृश्य (उसी के समान InfoView
) बनाऊंगा जो #name
ब्लॉक को हैंडल करेगा ।
अब Child
विचारों के लिए, विचारों के initialization
समान सुंदर है Parent
, बस किसी भी आगे के Child
विचारों के निर्माण के बिना । इसलिए:
- मेरे विचार को प्रारंभ करें
- मैं जिस मॉडल की परवाह करता हूं, उसके बदलाव के लिए सेटअप बाइंडिंग सुनता है
- मेरे विचार का प्रतिपादन करें
Child
देखें प्रतिपादन भी बहुत सरल है, बस प्रस्तुत करना और मेरी सामग्री सेट करना el
। फिर, प्रतिनिधिमंडल के साथ कोई खिलवाड़ या ऐसा कुछ नहीं।
यहाँ कुछ उदाहरण कोड है जो मेरे ParentView
जैसा दिख सकता है:
var ParentView = Backbone.View.extend({
el: "#parent",
initialize: function() {
// Step 1, (init) I want to know anytime the name changes
this.model.bind("change:first_name", this.subRender, this);
this.model.bind("change:last_name", this.subRender, this);
// Step 2, render my own view
this.render();
// Step 3/4, create the children and assign elements
this.infoView = new InfoView({el: "#info", model: this.model});
this.phoneListView = new PhoneListView({el: "#phone_numbers", model: this.model});
},
render: function() {
// Render my template
this.$el.html(this.template());
// Render the name
this.subRender();
},
subRender: function() {
// Set our name block and only our name block
$("#name").html("Person: " + this.model.first_name + " " + this.model.last_name);
}
});
आप subRender
यहाँ मेरा कार्यान्वयन देख सकते हैं । के subRender
बजाय बाध्य परिवर्तन होने से render
, मुझे नष्ट करने और पूरे ब्लॉक के पुनर्निर्माण के बारे में चिंता करने की ज़रूरत नहीं है।
यहाँ InfoView
ब्लॉक के लिए उदाहरण कोड है :
var InfoView = Backbone.View.extend({
initialize: function() {
// I want to re-render on changes
this.model.bind("change", this.render, this);
// Render
this.render();
},
render: function() {
// Just render my template
this.$el.html(this.template());
}
});
बाँध यहाँ का महत्वपूर्ण हिस्सा हैं। अपने मॉडल से जुड़कर, मुझे कभी भी render
खुद को फोन करने की चिंता नहीं करनी चाहिए। यदि मॉडल बदलता है, तो यह ब्लॉक किसी अन्य दृश्य को प्रभावित किए बिना खुद को फिर से प्रस्तुत करेगा।
के PhoneListView
समान होगा ParentView
, आपको संग्रह को संभालने के लिए बस अपने initialization
और render
कार्यों दोनों में थोड़ा और तर्क की आवश्यकता होगी । आप संग्रह को कैसे संभालते हैं यह वास्तव में आप पर निर्भर करता है, लेकिन आपको कम से कम संग्रह की घटनाओं को सुनना होगा और यह निर्णय लेना होगा कि आप कैसे प्रस्तुत करना चाहते हैं (जोड़ना / हटाना, या पूरे ब्लॉक को फिर से प्रस्तुत करना)। मुझे व्यक्तिगत रूप से नए विचारों को जोड़ना और पुराने लोगों को हटाना पसंद है, न कि पूरे दृश्य को फिर से प्रस्तुत करना।
PhoneView
लगभग समान हो जाएगा InfoView
, केवल मॉडल परिवर्तन इसके बारे में परवाह करता है को सुन।
उम्मीद है कि इसने थोड़ी मदद की है, कृपया मुझे बताएं कि क्या कुछ भ्रामक है या पर्याप्त विस्तृत नहीं है।