2011-11-21 8 views
10

के साथ रीढ़ की हड्डी दृश्य मुझे लगा कि मैं Backbone.View की el विशेषता को गलत समझा रहा था। असल में मेरे विचारों को इसके मॉडल की विशेषता के आधार पर गतिशील id विशेषताओं की आवश्यकता होती है। मैंने सोचा कि मैं इस काम कर ठीक है, क्योंकि मैं केवल मेरे टेम्पलेट में यह निर्दिष्ट था:गतिशील आईडी

<script type="text/template" id="item_template"> 
    <li class="item" id="{{identifier}}"> 
    <span class="name">{{name}}</span> 
    </li> 
</script> 

हालांकि, मैंने महसूस किया कि क्या बैकबोन गया था वास्तव में यह करके संकलित टेम्पलेट एक और तत्व में डिफ़ॉल्ट रूप से डाल दिया गया था, div। मैंने दस्तावेज़ीकरण को पढ़कर इसके बारे में और कुछ सीखा, लेकिन मैं अभी भी एक गतिशील id बनाने के तरीके पर उलझन में हूं।

अधिमानतः, मुझे ऐसा करने का तरीका ढूंढना अच्छा लगेगा कि उपरोक्त टेम्पलेट में सामान मेरे el के रूप में कार्य करता है, क्योंकि इसमें पहले से ही सब कुछ है जो मुझे चाहिए, लेकिन मुझे नहीं पता कि यह संभव है या नहीं। तो मैं सोच रहा हूं कि, काफी सरलता से, एक गतिशील id विशेषता निर्दिष्ट करने का एक तरीका है।

मैंने इसे initialize विधि, this.id = this.model.get('attr') में सेट करने का प्रयास किया लेकिन ऐसा कोई प्रभाव नहीं प्रतीत होता, संभवतः क्योंकि इस समय तक यह बहुत देर हो चुकी है।

क्या मैं वर्तमान में कर रहा हूँ बस जोड़ने के लिए jQuery उपयोग कर रहा है id में render() दौरान:

this.el.attr(id: this.model.get('identifier')); 

यह काम करता है, लेकिन निश्चित रूप से, मैं बस अगर वहाँ यह करने के लिए एक पसंदीदा तरीका है पूछ रहा हूँ बैकबोन के माध्यम से।

उत्तर

20

हाँ वहाँ रीढ़ में यह करने के लिए एक मानक तरीका है। आप व्यू कन्स्ट्रक्टर को id पास कर सकते हैं। आप अपने टेम्पलेट को फिर से प्रतिक्रिया भी दे सकते हैं ताकि बैकबोन आपके लिए पैरेंट <li> तत्व बनाता है। इस सरल टेम्पलेट का प्रयास करें:

<script type="text/template" id="item_template"> 
    <span class="name">{{name}}</span> 
</script> 

और आपके विचार के लिए इन जोड़ें:

myView = Backbone.View.extend({ 
    className: "item", 
    tagName: "li" 
}) 

और इस तरह यह दृष्टांत:

var view = new YourView({ 
    model: mymodel, 
    id: mymodel.get('identifier') // or whatever 
}) 

गुड लक!

+0

धन्यवाद फिर maxl0rd (दूसरे प्रश्न पर मेरी मदद की: डी)। यह वास्तव में ऐसा लगता है जैसे इसे काम करना चाहिए: डी मैं इसे आज़माउंगा और सही के रूप में चिह्नित करने के लिए वापस आऊंगा :) –

+0

उन लोगों के लिए जो टैग नहीं करते हैं, निर्दिष्ट नहीं होने पर टैगनाम डिफ़ॉल्ट रूप से div को डिफ़ॉल्ट करता है। मुझे एक अच्छी संख्या में टेम्पलेट दिखाई देंगे जिसमें एक कंटेनर [फॉर्म, div, आदि है ...एक आईडी के साथ] और वह वास्तव में दृश्य का हिस्सा होना चाहिए, न कि टेम्पलेट अक्सर। जैसा कि maxl0rd के उत्तर में दिखाया गया है – PDA

1

जब आप अपने दृश्य बनाते हैं, एक चयनकर्ता दृश्य अपने मौजूदा पूर्व गाया डोम तत्व को खोजने देंगे में पारित:

var id = "1234"; 
var view = YourView({el: '#'+id}); 
+0

तत्व पूर्व प्रदान की गई है, और DOM में के रूप में तक मुझे पता है नहीं है। यह सिर्फ एक स्क्रिप्ट टैग के भीतर एक टेम्पलेट के रूप में है। –

5

एक और दृष्टिकोण है। जब भी आप अपने विचार का उदाहरण बनाते हैं, तो मुझे id पास करने से अधिक सुविधाजनक लगता है।

टेम्पलेट:

<script type="text/template" id="item_template"> 
     <span class="name">{{name}}</span> 
</script> 

दृश्य:

var MyView = Backbone.View.extend({ 
    tagName: 'li', 
    attributes: function(){ 
     return { 
      id: this.model.get('identifier'), 
      class: 'item'//optionally, you could define it statically like before 
     } 
    } 
}) 
+0

इस उत्तर को उत्तर दें, क्योंकि इसमें 'कन्स्ट्रक्टर' में परिभाषित सामान्य समाधान है – Mikhail

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