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.
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? –
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
ha funzionato per me. Puoi anche farlo in un'altra funzione e chiamare this.render() in seguito e cambierà il modello. Cose divertenti! –