2012-09-17 65 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

您正在將this.template設置爲一個方法,並且Marionette正在查找字符串值。

您可能會使用相同的邏輯,但將其放入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

酷,的作品!我以爲我嘗試過這樣的事情,但我一定做錯了什麼。你有沒有辦法根據時間框架設置itemView的模板? –

+1

只需注意:Marionette用於接受將返回動態選擇器的模板的函數。現在它接受的函數被用作編譯模板函數。 – jsoverson

+2

它爲我工作。您也可以在另一個函數中執行此操作,然後調用this.render(),它將切換模板。好玩的東西! –