2012-09-17 20 views
12

Bir kullanıcının o tarihin geçmişte mi yoksa gelecekte mi olduğuyla ilgili bir Backbone görünümü şablonunu ayarlamam gerekiyor. Bunu nasıl yaparım? Şablonu, geçmişte olup olmadığına göre doğru seçici dizeyi döndüren bir işleve ayarlayabileceğimi düşündüm, ama bu işe yaramıyor. Burada ben de kukla en kompozit görüşlerini kullanıyorumOmurga dinamik olarak şablonları değiştirme

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; 
     } 
    } 
}); 

Not, bu yüzden de zamanlamasına göre itemView şablonunu değiştirmek için bir yol gerekir. Temel stratejimin iyi düşünülmemesi durumunda buna farklı şekilde yaklaşmaya kesinlikle açıkım.

cevap

16

Bu.template'i bir yöntem olarak ayarlıyorsunuz ve Marionette bir dize değeri arıyor.

Muhtemelen aynı mantığı kullanarak ancak initialize yönteminize ekleyerek uzaklaşabilirsiniz.

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

Serin (Ben googling buydu) Ben belgelerinde gördüm biliyorum GetTemplate adında bir işlev bunun için inşa yoktur, yani çalışıyor! Böyle bir şey denedim sanıyordum, ama yanlış bir şey yapmış olmalıyım. ItemView'un şablonunu zamana göre ayarlamak için herhangi bir yolunuz var mı? –

+1

Sadece bir not: Kukla, dinamik bir seçici döndüren bir şablon için bir işlevi kabul etmek için kullanılırdı. Şimdi kabul ettiği işlev derlenmiş şablon işlevi olarak kullanılır. – jsoverson

+2

benim için çalıştı. Bunu başka bir işlevde de yapabilir ve daha sonra this.render() öğesini çağırabilir ve şablonu değiştirir. Eğlenceli şeyler! –

İlgili konular