2012-09-17 18 views
12

Ho bisogno di impostare inizialmente il modello di una vista Backbone in base al fatto che la data selezionata dall'utente sia nel passato o nel futuro, oltre a cambiarla in un secondo momento quando la collezione modifica i dati da una data diversa. Come faccio a fare questo? Ho pensato che sarei stato in grado di impostare il modello su una funzione che restituisce la stringa di selezione corretta in base al fatto che io sia nel passato o meno, ma questo non funziona.Backbone cambia modello dinamicamente

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

Si noti che sto usando viste composite di Marionette anche qui, quindi ho bisogno di un modo per cambiare modello del itemView sulla base del lasso di tempo pure. Sono assolutamente aperto ad affrontarlo in modo diverso se la mia strategia di base è mal concepita.

risposta

16

Si sta impostando questo.template su un metodo e Marionetta sta cercando un valore stringa.

Probabilmente è possibile scappare usando la stessa logica ma inserendola nel proprio metodo 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

fredda, che funziona! Pensavo di aver provato qualcosa del genere, ma devo aver fatto qualcosa di sbagliato. Avete un modo per impostare il modello itemView in base ai tempi? –

+1

Solo una nota: Marionetta accettava una funzione per un modello che restituiva un selettore dinamico. Ora la funzione che accetta viene utilizzata come funzione del modello compilato. – jsoverson

+2

ha funzionato per me. Puoi anche farlo in un'altra funzione e chiamare this.render() in seguito e cambierà il modello. Cose divertenti! –

Problemi correlati