2012-02-06 6 views
16

मैं एक Underscore.js टेम्पलेट का उपयोग कर select सूची के रूप में एक Backbone.js संग्रह प्रस्तुत करने का प्रयास कर रहा हूं, और सूची पॉप्युलेट नहीं हो रही है। select तत्व प्रदर्शित हो रहा है, लेकिन options नहीं हैं।एक चुनिंदा सूची के रूप में Backbone.js संग्रह को प्रस्तुत करना

मैंने पुष्टि की है कि मैं अपने टेम्पलेट में अलग-अलग गुणों को पारित करने में सक्षम हूं और उन्हें label तत्वों के रूप में प्रस्तुत करने में सक्षम हूं, इसलिए समस्या यह होनी चाहिए कि मैं संग्रह को संभालने का प्रयास कैसे कर रहा हूं।

Rate = Backbone.Model.extend({ 
    duration : null 
}); 

Rates = Backbone.Collection.extend({ 
    initialize: function (model, options) { 
    } 
}); 

AppView = Backbone.View.extend({ 
    el: $('#rate-editor-container'), 
    initialize: function() { 
     this.rates = new Rates(null, { view: this }); 

     this.rates.add(new Rate ({ duration: "Not Set" })); 
     this.rates.add(new Rate ({ duration: "Weekly" })); 
     this.rates.add(new Rate ({ duration: "Monthly" })); 

     this.render(); 
    }, 
    render: function() { 
     var rate_select_template = _.template($("#rate_select_template").html(), {rates: this.rates, labelValue: 'Something' }); 
     $('#rate-editor-container').html(rate_select_template); 
    }, 
}); 

var appview = new AppView(); 

और मेरे टेम्पलेट:

<script type="text/template" id="rate_select_template"> 
    <select id="rate-selector"></select> 
    <% _(rates).each(function(rate) { %> 
    <option value="<%= rate.duration %>"><%= rate.duration %></option> 
    <% }); %> 
</script> 

<div id="rate-editor-container"></div> 

कोई सुझाव

यहाँ मेरी रीढ़ कोड है?

+0

अपने प्रस्तुत फ़ंक्शन में 'इस' के मान को दोबारा जांचें- मैं आपको बैकबोन ऑब्जेक्ट पर बाध्यकारी नहीं देखता हूं। आप इसे अपने प्रारंभिक फ़ंक्शन में _.bindAll (यह, 'रेंडर') के साथ कर सकते हैं। –

+0

हमम। मैंने कहा कि मेरे 'Backbone.View' एक्सटेंशन में' this.render() 'से ऊपर है, लेकिन ऐसा कुछ भी प्रतीत नहीं होता है। मैंने अपना प्रश्न पोस्ट करने से पहले, मैंने 'console.log (this.rates) 'किया था और इसे तीन उप-ऑब्जेक्ट्स के साथ' बच्चे 'के रूप में आउटपुट किया था। तो मुझे लगता है कि मैं किसी प्रकार का ऑब्जेक्ट पास कर रहा हूं जिसमें तीन वस्तुओं को निहित किया गया है, जो सही लगता है। –

+0

@ फैक्टर: बैकबोन के हाल के संस्करणों में 'प्रतिनिधि एवेन्ट्स' स्वयं बाध्यकारी करता है ('method = _ के लिए देखो।बाइंड (विधि, यह); 'नवीनतम स्रोत] में' प्रतिनिधि 'एवेन्ट्स के अंदर' (http://documentcloud.github.com/backbone/backbone.js)) ताकि आपको अब सामान्य '_.bindAll' नृत्य की आवश्यकता न हो अपनी 'प्रारंभिक' विधियां शुरू करें। –

उत्तर

34

आपके पास कुछ अलग समस्याएं हैं।

  1. आपका टेम्पलेट के बाद<select> बजाय इसके अंदर <option> तत्वों डाल करने के लिए कोशिश कर रहा है। यह अमान्य HTML उत्पन्न करेगा और ब्राउजर कुचल देगा कि एक बार जब आप अपने टेम्पलेट से कुछ प्राप्त कर लेंगे।
  2. rates एक बैकबोन संग्रह है, इसलिए इसकी पहले से ही Underscore'seach तक पहुंच है; इसे _(rates) के रूप में लपेटकर बस अंडरस्कोर को भ्रमित कर देता है और किसी भी पुनरावृत्ति को होने से रोकता है।
  3. पुनरावृत्ति के अंदर, rate एक बैकबोन मॉडल उदाहरण है, इसलिए इसमें duration संपत्ति नहीं होगी, आपको rate.get('duration') कहना होगा।

आपका टेम्पलेट अधिक इस तरह दिखना चाहिए:

<script type="text/template" id="rate_select_template"> 
    <select id="rate-selector"> 
     <% rates.each(function(rate) { %> 
      <option value="<%= rate.get('duration') %>"><%= rate.get('duration') %></option> 
     <% }); %> 
    </select> 
</script> 

डेमो: http://jsfiddle.net/ambiguous/AEqjn/

वैकल्पिक रूप से, तुम सिर्फ अपने खाके में घोंसले त्रुटि को ठीक मान्य HTML उत्पादन करने के लिए कर सकते हैं:

<script type="text/template" id="rate_select_template"> 
    <select id="rate-selector"> 
     <% _(rates).each(function(rate) { %> 
      <option value="<%= rate.duration %>"><%= rate.duration %></option> 
     <% }); %> 
    </select> 
</script> 

और संग्रह के बजाए अपने टेम्पलेट पर कच्चे डेटा को खिलाने के लिए toJSON() का उपयोग करें :

var rate_select_template = _.template($("#rate_select_template").html(), { 
    rates: this.rates.toJSON(), 
    labelValue: 'Something' 
}); 

डेमो: http://jsfiddle.net/ambiguous/VAxFW/

मुझे लगता है कि बाद के एक क्या आपको लगता है कि के रूप में के लिए लक्ष्य कर रहे थे होगा रीढ़ में टेम्पलेट्स के साथ काम करने के लिए एक अधिक मानक दृष्टिकोण।

+6

बहुत बढ़िया, स्पष्ट स्पष्टीकरण के लिए धन्यवाद। विश्वास नहीं कर सकता कि मैंने 'चयन' घोंसले के साथ इस मुद्दे को याद किया। ओह। Backbone.js ऐसा लगता है कि यह बहुत अच्छा होगा, लेकिन इस तरह की कुछ मूलभूत सामग्री के लिए उदाहरण ढूंढना असंभव है। टोडो ऐप जैसे नमूना ऐप्स में बहुत कुछ चल रहा है, और यह देखना मुश्किल है कि प्रत्येक टुकड़ा क्या करता है। मैं मदद की सराहना करता हूं। :) –

+4

@ जोश: बुनियादी पैटर्न को समझने के बाद काम करना अच्छा होता है, निश्चित रूप से बुनियादी पैटर्न को समझने का एकमात्र तरीका गलत बनाना है। –

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