सारांश: मॉडल डेटा के साथ गतिशील रूप से सेट दृश्य विशेषताएँ
http://jsfiddle.net/5wd0ma8b/
var View = Backbone.View.extend( {
attributes : function () {
return {
class : this.model.get( 'item_class' ),
id : this.model.get( 'item_id' )
};
}
} );
var item = new View( {
model : new Backbone.Model( {
item_class : "nice",
item_id : "id1"
} )
} );
यह उदाहरण मानता है कि आप Backbone को आपके लिए DOM तत्व उत्पन्न करने की अनुमति दे रहे हैं।
attributesबाद गुण दृश्य निर्माता के लिए पारित सेट कर रहे हैं विधि कहा जाता है (इस मामले में, model), आप गतिशील मॉडल डेटा के साथ विशेषताओं से पहले रीढ़ बनाता है स्थापित करने के लिए अनुमति देता el।
कुछ अन्य उत्तरों के विपरीत: दृश्य वर्ग में हार्ड-कोड विशेषता मान नहीं है, गतिशील रूप से उन्हें मॉडल डेटा से सेट करता है; render()Attr vals सेट होने तक प्रतीक्षा न करें ; बार-बार प्रत्येक कॉल के लिए attr vals सेट नहीं करता render(); अनावश्यक रूप से DOM तत्व पर मैन्युअल रूप से attr वैल सेट नहीं करता है।
ध्यान दें कि यदि वर्ग जब बुला की स्थापना Backbone.View.extendया एक दृश्य के निर्माता (जैसे new Backbone.View), आप डोम संपत्ति नाम का उपयोग करना, className, लेकिन अगर के माध्यम से इसे स्थापित करने attributesहैश / विधि (इस उदाहरण में के रूप में) आप विशेषता नाम का उपयोग करना, class।
रीढ़ की हड्डी के रूप में 0.9.9:
जब एक दृश्य की घोषणा ... el, tagName, idऔर classNameअब कार्यों के रूप में परिभाषित किया जा सकता है, अगर आप चाहते हैं उनके मूल्यों रनटाइम पर निर्धारित किया जाना।
मैं इस मामले में इसका उल्लेख करता हूं कि ऐसी स्थिति है जहां यह attributesसचित्र के रूप में एक विधि का उपयोग करने के विकल्प के रूप में उपयोगी होगा ।
किसी मौजूदा तत्व का उपयोग करना
यदि आप किसी मौजूदा तत्व का उपयोग कर रहे हैं (जैसे elव्यू कंस्ट्रक्टर को पास करना) ...
var item = new View( { el : some_el } );
... तो attributesतत्व पर लागू नहीं किया जाएगा। यदि वांछित विशेषताएँ पहले से ही तत्व पर सेट नहीं हैं, या आप उस डेटा को अपने दृश्य वर्ग और किसी अन्य स्थान पर डुप्लिकेट नहीं करना चाहते हैं, तो आप initializeअपने व्यू कंस्ट्रक्टर में एक विधि जोड़ना चाह सकते हैं जो लागू होता attributesहै el। कुछ इस तरह (उपयोग करते हुए jQuery.attr):
View.prototype.initialize = function ( options ) {
this.$el.attr( _.result( this, 'attributes' ) );
};
elआवरण से बचने, रेंडरिंग का उपयोग
अधिकांश उदाहरणों में मैंने देखा है, दृश्य के एल एक अर्थहीन आवरण तत्व के रूप में कार्य करता है, जिसके अंदर किसी को मैन्युअल रूप से 'शब्दार्थ' कोड लिखना होता है।
कोई कारण नहीं view.elहै "एक अर्थहीन आवरण तत्व" होने की आवश्यकता है। वास्तव में, यह अक्सर DOM संरचना को तोड़ देगा। यदि कोई दृश्य वर्ग <li>उदाहरण के लिए एक तत्व का प्रतिनिधित्व करता है , तो उसे एक <li>- <div>या इसे किसी अन्य तत्व के रूप में प्रस्तुत करते हुए सामग्री मॉडल को तोड़ना होगा। आप की संभावना सही ढंग से अपने दृश्य के तत्व की स्थापना (जैसे गुणों का उपयोग करके पर ध्यान केंद्रित करना चाहते हैं tagName, classNameऔर id) और फिर अपने प्रतिपादन सामग्री उसके बाद।
डोम के साथ बातचीत करने के लिए आपके बैकबोन व्यू ऑब्जेक्ट्स के लिए विकल्प व्यापक खुले हैं। 2 मूल प्रारंभिक परिदृश्य हैं:
आप किसी मौजूदा DOM तत्व को बैकबोन दृश्य में संलग्न कर सकते हैं।
आप बैकबोन को एक नया तत्व बनाने की अनुमति दे सकते हैं जो दस्तावेज़ से डिस्कनेक्ट हो गया है, फिर किसी तरह इसे दस्तावेज़ में डालें।
ऐसे विभिन्न तरीके हैं जिनसे आप तत्व के लिए सामग्री तैयार कर सकते हैं (शाब्दिक स्ट्रिंग सेट करें, जैसा कि आपके उदाहरण में, एक टेंपलेटिंग लाइब्रेरी जैसे मूंछें, हैंडलबार इत्यादि का उपयोग करें)। आपको कैसे उपयोग करना चाहिएel दृश्य संपत्ति का निर्भर करता है कि आप क्या कर रहे हैं।
विद्यमान तत्व
आपके रेंडरिंग उदाहरण से पता चलता है कि आपके पास एक मौजूदा तत्व है जिसे आप दृश्य में असाइन कर रहे हैं, हालांकि आप विचारों का इंस्टेंटेशन नहीं दिखाते हैं। यदि ऐसा है, और तत्व पहले से ही दस्तावेज़ में है, तो आप ऐसा कुछ करना चाह सकते हैं (सामग्री को अपडेट करें el, लेकिन elस्वयं को परिवर्तित न करें ):
render : function () {
this.$el.html( "Some stuff" );
}
http://jsfiddle.net/vQMa2/1/
जनित तत्व
मान लें कि आपके पास कोई मौजूदा तत्व नहीं है और आप बैकबोन को आपके लिए एक जेनरेट करने की अनुमति देते हैं। आप ऐसा कुछ करना चाह सकते हैं (लेकिन यह बेहतर है कि आर्किटेक्ट चीजों को बेहतर बनाया जाए ताकि आपका नजरिया खुद के बारे में कुछ भी जानने के लिए जिम्मेदार न हो):
render : function () {
this.$el.html( "Some stuff" );
$( "#some-container" ).append( this.el );
}
http://jsfiddle.net/vQMa2/
टेम्पलेट्स
मेरे मामले में, मैं टेम्पलेट्स का उपयोग कर रहा हूं, उदाहरण के लिए:
<div class="player" id="{{id}}">
<input name="name" value="{{name}}" />
<input name="score" value="{{score}}" />
</div>
<!-- .player -->
टेम्पलेट संपूर्ण दृश्य का प्रतिनिधित्व करता है। दूसरे शब्दों में, टेम्पलेट के आसपास कोई आवरण नहीं होगा -div.player होगा मेरे विचार का मूल या सबसे बाहरी तत्व होगा।
मेरा खिलाड़ी वर्ग कुछ इस तरह दिखाई देगा (बहुत सरलीकृत उदाहरण के साथ render()):
Backbone.View.extend( {
tagName : 'div',
className : 'player',
attributes : function () {
return {
id : "player-" + this.model.cid
};
},
render : function {
var rendered_template = $( ... );
this.$el.empty().append( rendered_template.children() );
}
} );