2012-01-21 21 views
6

Tôi có chế độ xem bảng công việc hiển thị tất cả công việc của người dùng. Bộ sưu tập công việc fetch() có thể có khả năng trả về chứa hàng ngàn bản ghi. Tôi chạy một thử nghiệm và chèn 1000 hồ sơ công việc trong DB và thực hiện một fetch() trên bộ sưu tập. Tuy nhiên, 1000 bản ghi có vẻ quá nhiều để trình duyệt xử lý vì việc chèn 1000 hàng trong bảng DOM dường như làm cho trình duyệt đóng băng.Backbone.js fetch() tập hợp lớn khiến tập lệnh đóng băng

Có cách nào tốt hơn để tối ưu hóa hiển thị các hàng để nó hoạt động nhanh hơn không? Tôi biết bạn luôn có thể thực hiện tìm nạp một phần (tìm nạp 100 bản ghi ban đầu và bổ sung tìm nạp 100 bản ghi mỗi khi người dùng cuộn xuống cuối màn hình), nhưng tôi thường chống lại ý tưởng này kể từ khi cuộn xuống 100 bản ghi và phải đợi 3 -4 giây trước khi nó hiển thị thêm 100 bản ghi có vẻ dẫn đến trải nghiệm người dùng kém.

Dưới đây là mã của tôi:

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

}); 

Trả lời

5

tất cả phụ thuộc vào những gì trải nghiệm ứng nhu cầu người sử dụng, những gì ông sẽ phải làm gì với công việc, người dùng của bạn, nó là một ứng viên tiềm năng đó là tìm kiếm một công việc nào đó? hoặc là loại ứng dụng quản trị nơi người dùng là ai đó đang quản lý công việc?

nói chung việc đặt 1000 mục trên 1 trang là điều bất tiện, làm việc với tải thêm công việc khi cuộn xuống là một tính năng nóng như facebook, twitter ... điều này có thể hữu ích cho nhận xét nhưng công việc , người ta cần một cách để nhảy từ đầu đến cuối mà không cần phải bấm "nhiều hơn" 10 lần, hoặc di chuyển xuống 10 lần.

giải pháp khả thi:

  1. như vậy, phân trang là tất nhiên tùy chọn khác, sử dụng một máy nhắn tin là defenately một cách để làm việc với quá nhiều mặt hàng, và đem lại cho con người một cách để nhảy từ trang 1 đến 10 mà không đi qua máng 9 người khác.
  2. một việc khác bạn có thể làm là xây dựng trong bộ lọc, người ta có thể tìm kiếm việc làm theo: vị trí, doanh nghiệp, ngành, ... điều này sẽ giảm kích thước của bộ sưu tập hiển thị mọi lúc.

tinh khiết giải pháp kỹ thuật:

bạn nên đọc lên trên this blog post, nó bắt đầu về làm thế nào để có được những mục nhấp chính xác từ một cái nhìn nếu bạn trả lại tất cả các mục của một bộ sưu tập chỉ trong 1 cái nhìn, nhưng phát triển thành vấn đề ở đây, có 1000 lượt xem riêng biệt cho mỗi công việc được thêm vào jobListView hoặc có thêm các công việc đó trong jobListView để chỉ có 1 chế độ xem.

Sau này có thể được triển khai chính xác, giảm đáng kể tương tác của ứng dụng của bạn với DOM. Với việc thực hiện đúng, tôi có nghĩa là, thêm tất cả các công việc trong vòng lặp for, bằng cách thêm chúng vào một bảng/danh sách trong bộ nhớ, và chỉ ở cuối cùng, đính kèm bảng/danh sách vào DOM, điều này làm giảm mã của bạn thành 1 tương tác DOM , thay vì 1000 phụ thêm.

Có, Derick dựa nhiều hơn vào việc hiển thị 1 chế độ xem cho mỗi mô hình, mặc dù anh ta không chạm vào đối tượng của hiệu suất ngoại trừ một nhỏ: đầu tiên làm cho nó sau đó làm cho nó nhanh tuyên bố mà không cung cấp bất kỳ giải pháp cho bạn. Và nếu danh sách công việc của bạn chỉ là danh sách và liên kết đến trang chi tiết công việc, không có nhiều sự kiện, thì chế độ xem 1 để cai trị tất cả tùy chọn vẫn còn rất hợp lệ.

+0

Tôi đã thử ví dụ trong bài đăng trên blog và nó thực sự dường như không cải thiện hiệu suất nhiều. Cho dù bạn đang phụ thêm vào DOM hay phụ thêm vào một phần tử trong bộ nhớ, bạn vẫn đang gọi hàm append của jQuery() 1000 lần – peter

+0

có nhưng jquery chắp thêm mà không làm việc đó với chính nó là nhanh hơn. thậm chí như vậy, vẫn còn các giải pháp tốt hơn, nó có thể trông bẩn thỉu, nhưng xây dựng html của bạn theo cách thủ công (hoặc với các mẫu) và làm một $ (elem) .html (myBuildUpHtmlString); thậm chí còn nhanh hơn sau đó bạn không có 1000 phụ thêm. – Sander

2

Hiệu suất kém của bạn có thể do bạn đang thêm hàng trực tiếp vào DOM. Mỗi khi bạn làm điều này trình duyệt sẽ reflow.

Tôi sẽ tạo bảng trong bộ nhớ và sau đó thêm toàn bộ bảng vào DOM khi được tạo.