2012-09-17 7 views
12

मुझे शुरुआत में बैकबोन व्यू के टेम्पलेट को सेट करने की आवश्यकता है, इस पर आधारित है कि उपयोगकर्ता द्वारा चुनी गई तिथि अतीत या भविष्य में है या साथ ही बाद में स्विच करें जब संग्रह संग्रह अलग-अलग तारीख से डेटा खींचता है। मैं यह कैसे करु? मैंने सोचा कि मैं टेम्पलेट को ऐसे फ़ंक्शन पर सेट करने में सक्षम हूं जो सही चयनकर्ता स्ट्रिंग देता है कि मैं अतीत में हूं या नहीं, लेकिन यह काम नहीं करता है।बैकबोन गतिशील रूप से टेम्पलेट्स स्विच करें

pR.views.ScheduleJobView = Backbone.Marionette.ItemView.extend({ 
    tagName: "tr", 
    // NEED A WAY TO SWITCH THIS TOO 
    template: "#schedule-job-template" 
}); 


pR.views.ScheduleJobsView = Backbone.Marionette.CompositeView.extend({ 
    // DOESN'T WORK 
    template: function() { 
     if (this.isPast) 
      return "#schedule-jobs-past-template"; 
     else 
      return "#schedule-jobs-template"; 
    },  itemView: pR.views.ScheduleJobView, 

    itemView: pR.views.ScheduleJobView, 
    itemViewContainer: "tbody", 

    // Defaults for the model's url 
    baseUrl: "/schedules/day/", 
    baseApiUrl: "/api/schedule/day/", 
    // Empty object to store url parameters 
    urlParameters: {}, 

    initialize: function() { 
     pR.vent.bindTo("change:parameters", this.changeUrl, this); 
     this.model.url = this.baseApiUrl; 
    }, 

    onRender: function() { 
     console.log("Rendering Jobs View"); 
    }, 

    // Change the main model's url 
    changeUrl: function (parameters) { 
     // merge new parameters with old ones 
     this.urlParameters = _.extend(this.urlParameters, parameters); 

     var url = ""; 
     var apiUrl = this.baseApiUrl; 

     _.each(this.urlParameters, function (value, parameter) { 
      // Add each parameter segment to the url 
      url = url + parameter + '/' + value + '/'; 
      apiUrl = apiUrl + parameter + '/' + value + '/'; 
     }); 

     this.model.url = apiUrl; 
     console.log("Updated CurrentDay model url to " + apiUrl); 
     this.model.fetch(); 

     console.log("Navigating to " + url); 
     pR.routers.appRouter.navigate(url); 
    }, 

    // Check if we are in the past 
    isPast: function() { 
     var year = this.urlParameters.year; 
     var month = this.urlParameters.month; 
     var day = this.urlParameters.day; 
     var selectedDate = Date(year, month, day); 

     if (selectedDate < Date()){ 
      return true; 
     } else { 
      return false; 
     } 
    } 
}); 

ध्यान दें कि मैं कठपुतली के समग्र विचारों यहाँ भी उपयोग कर रहा हूँ, इसलिए मैं साथ ही समय सीमा के आधार पर itemView के टेम्पलेट को बदलने के तरीके की जरूरत है। अगर मेरी मूल रणनीति खराब तरीके से सोची जाती है तो मैं निश्चित रूप से इस पर पहुंचने के लिए खुली हूं।

उत्तर

16

आप इस साइट को एक विधि में सेट कर रहे हैं, और मैरियनेट एक स्ट्रिंग मान की तलाश में है।

आप शायद उसी तर्क का उपयोग कर दूर हो सकते हैं लेकिन इसे अपने initialize विधि में डाल सकते हैं।

pR.views.ScheduleJobsView = Backbone.Marionette.CompositeView.extend({ 
    template: null, 
    [ ... ] 
    initialize: function() { 
     if (this.isPast) { 
      this.template = "#schedule-jobs-past-template"; 
     } else { 
      this.template = "#schedule-jobs-template"; 
     } 
+0

कूल, कि काम करता है! मैंने सोचा कि मैंने ऐसा कुछ करने की कोशिश की है, लेकिन मैंने कुछ गलत किया होगा। क्या आपके पास टाइमफ्रेम के आधार पर आइटम दृश्य का टेम्पलेट सेट करने का कोई तरीका है? –

+1

बस एक नोट: मैरियनेट एक टेम्पलेट के लिए एक फ़ंक्शन स्वीकार करने के लिए प्रयुक्त होता है जो गतिशील चयनकर्ता को वापस लाएगा। अब यह स्वीकार करता है कि फ़ंक्शन संकलित टेम्पलेट फ़ंक्शन के रूप में उपयोग किया जाता है। – jsoverson

+2

यह मेरे लिए काम किया। आप इसे किसी अन्य फ़ंक्शन में भी कर सकते हैं और इसे बाद में भेज सकते हैं।() बाद में और यह टेम्पलेट को स्विच करेगा। मजेदार चीजें! –

2

मैं जानता हूँ कि मैं दस्तावेज में इसे देखा एक समारोह getTemplate कहा जाता है इस के लिए बनाया है, (यही कारण है कि मैं के लिए googling था)

Marionette template switching documentation