2012-09-17 29 views
12

Tôi cần thiết lập mẫu khung nhìn của Backbone dựa trên ngày mà người dùng đã chọn trong quá khứ hay tương lai cũng như chuyển đổi sau này khi bộ sưu tập thay đổi kéo dữ liệu từ một ngày khác. Làm thế nào để tôi làm điều này? Tôi nghĩ rằng tôi sẽ có thể thiết lập các mẫu để một chức năng trả về chuỗi chọn chính xác dựa trên việc tôi đang trong quá khứ hay không, nhưng điều này không hoạt động.Backbone tự động chuyển đổi mẫu

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

Lưu ý rằng tôi đang sử dụng chế độ xem tổng hợp của Marionette tại đây, vì vậy tôi cũng cần cách thay đổi mẫu của itemView dựa trên khung thời gian. Tôi chắc chắn sẽ cởi mở để tiếp cận điều này một cách khác nếu chiến lược cơ bản của tôi bị suy nghĩ kém.

Trả lời

16

Bạn đang đặt this.template thành một phương thức và Marionette đang tìm giá trị chuỗi.

Có thể bạn có thể lấy đi bằng cách sử dụng cùng một logic nhưng đặt nó vào phương pháp initialize của bạn.

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

mát, mà làm việc! Tôi nghĩ rằng tôi đã thử một cái gì đó như thế này, nhưng tôi phải làm điều gì đó sai trái. Bạn có cách nào để thiết lập mẫu của itemView dựa trên khung thời gian không? –

+1

Chỉ cần một lưu ý: Marionette sử dụng để chấp nhận một chức năng cho một mẫu mà sẽ trả về một bộ chọn động. Bây giờ hàm nó chấp nhận được sử dụng như hàm mẫu đã biên dịch. – jsoverson

+2

nó làm việc cho tôi. Bạn cũng có thể làm điều này trong một hàm khác và gọi this.render() sau đó và nó sẽ chuyển đổi mẫu. Nội dung thú vị! –

Các vấn đề liên quan