Ho una vista tabella Lavori che visualizza tutti i lavori di un utente. La raccolta di lavori fetch() può potenzialmente restituire contenere migliaia di record. Ho eseguito un test e inserito 1000 record di lavoro nel DB ed eseguito un recupero() sulla raccolta. Tuttavia, 1000 record sembrano troppo da gestire per il browser poiché l'inserimento di 1000 righe della tabella DOM sembra causare il blocco del browser.Backbone.js fetch() la raccolta di grandi dimensioni causa il blocco dello script
C'è un modo migliore per ottimizzare il rendering delle righe in modo che funzioni più velocemente? So che puoi sempre eseguire un recupero parziale (recupera fino a 100 record e inoltre recupera 100 record ogni volta che l'utente scorre verso la parte inferiore dello schermo), ma di solito sono contrario a questa idea, poiché lo scorrimento di 100 record e il dover attendere 3 -4 secondi prima che vengano visualizzati altri 100 record sembrano avere un'esperienza utente scadente.
Ecco il mio codice:
FM.Views.JobTable = Backbone.View.extend({
initialize: function(){
_.bindAll(this, 'render', 'refresh', 'appendItem');
this.collection.bind('add', this.appendItem, this);
this.collection.bind('reset', this.refresh, this);
},
render: function(){
this.el = ich.JobTable({});
$(this.el).addClass('loading');
return this;
},
refresh: function(){
$('tbody tr', this.el).remove();
$(this.el).removeClass('loading');
_(this.collection.models).each(function(item){ // in case collection is not empty
this.appendItem(item);
}, this);
return this;
},
appendItem: function(item){
var jobRow = new FM.Views.JobTableRow({
model: item
});
$('tbody', this.el).prepend(jobRow.render().el);
$(jobRow).bind('FM_JobSelected', this.triggerSelected);
}
});
FM.Views.JobTableRow = Backbone.View.extend({
tagName: 'tr',
initialize: function(){
_.bindAll(this, 'render', 'remove', 'triggerSelected');
this.model.bind('remove', this.remove);
},
render: function(){
var j = this.model.toJSON();
j.quantity = j.quantity ? number_format(j.quantity, 0) : '';
j.date_start = date('M j Y', j.date_start);
j.date_due = j.date_due ? date('M j Y', strtotime(j.date_due)) : '';
j.paid_class = j.paid;
j.status_class = j.status;
j.paid = slug2words(j.paid);
j.status = slug2words(j.status);
this.el = ich.JobTableRow(j);
$(this.el).bind('click', this.triggerSelected);
return this;
}
});
Ho provato l'esempio nel post del blog e non sembra migliorare molto le prestazioni. Sia che si acceda al DOM o si acceda a un elemento in memoria, si sta ancora chiamando jQuery's append() 1000 volte – peter
sì, ma jquery append senza farlo al dom stesso è più veloce. anche così, ci sono ancora soluzioni migliori, potrebbe sembrare sporco, ma costruire manualmente il tuo html (o con i modelli) e fare un $ (elem) .html (myBuildUpHtmlString); è ancora più veloce, quindi non hai 1000 allegati. – Sander