Mam widok tabeli zadań, który wyświetla wszystkie zadania użytkownika. Funkcja pobierania kolekcji zadań() może potencjalnie zwrócić zawartość tysięcy rekordów. Uruchomiłem test i wstawiłem 1000 rekordów zadań do bazy danych i wykonałem funkcję pobierania() w kolekcji. Jednak 1000 rekordów wydaje się zbyt dużym obciążeniem dla przeglądarki, ponieważ wstawienie 1000 wierszy tabeli DOM wydaje się powodować zawieszenie się przeglądarki.Backbone.js fetch() duża kolekcja powoduje zatrzymanie skryptu
Czy istnieje lepszy sposób na zoptymalizowanie renderowania wierszy, aby działał szybciej? Wiem, że zawsze można wykonać częściowe pobranie (pobrać 100 początkowych rekordów i dodatkowo pobrać 100 rekordów za każdym razem, gdy użytkownik przewinie się na dół ekranu), ale ogólnie jestem przeciwny temu pomysłowi, ponieważ przewijam 100 rekordów i muszę poczekać 3 -4 sekundy przed renderowaniem dodatkowe 100 rekordów wydaje się powodować słabe wrażenia użytkownika.
Oto mój kod:
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;
}
});
Próbowałem tego przykładu w poście na blogu i nie wydaje się, że znacznie poprawia wydajność. Niezależnie od tego, czy dodajesz do DOM, czy dołączasz do elementu w pamięci, nadal wywołujesz jQuery's append() 1000 razy – peter
tak, ale dodanie jquery bez robienia tego w domenie jest szybsze. mimo to istnieją jeszcze lepsze rozwiązania, może wyglądać brudno, ale budowanie html ręcznie (lub z szablonami) i zrobić $ (elem) .html (myBuildUpHtmlString); jest jeszcze szybszy, niż Ty nie masz 1000 załączników. – Sander