2014-01-30 168 views
1

我有一個表格數據視圖,可以在每個單獨的列上排序。由於數據量巨大,我更願意在頁面中顯示少量行並按需加載行。因此,當用戶進行排序時,中的一列會向服務器發出新請求,並且新數據行被提取以顯示。 用戶可以修改兩列或更多列的排序類型(asc或desc),彈出頁面允許其修改更多列的排序類型。我試圖通過列的元數據(asc/desc和其他信息)的集合來解決此用例。更改收集器上的監聽器(顯然是監聽模型更改)

var ColumnsMetadata = Backbone.Collection.extend({ 
     model: ColMetadata 
    });   
    var ColMetadata = Backbone.Model.extend({ 
     defaults: { 
      sort: 'none' 
     } 
    }); 

A EditSortView頁面顯示和編輯列的排序信息。和一個TableView來顯示錶格數據。 TableViewEditSortview均共享ColumnsMetadata

var EditSortView = Backbone.View.extend({ 
    initialize: function() { 
     //this.colleciton = columnMetadataCollection 
    }, 
    events: function() { 
     "change input.sortVal" : "_updateSortMetdata", 
     "click button#sort": '_sort' 
    }, 
    _updateSortMetdata: function() { 
     // updates right ColMetadata instance' sort property 
    }, 
    _sort: funciton() { 
     // should make fetch request only when user finally 
     // satisfy with sort order changes 
    } 
}); 
var TableView = Backbone.View.extend({ 
    initialize: function() { 
     // other set up code 
     // i could add listener on collection 
     this.listenTo(this.columnMetadataCollection, 'change', this._fetchAndUpdate); 
    }, 
    _fetchAndUpdate: function() { 
     // uses columnMetadataCollection to fetch data 
    } 
}); 

正如我在TableView中加入change聽者上columnMetadataCollection,對於每個colMetadata變化(從EditSortView彈出)將觸發到服務器的新請求。但是,當用戶滿足所做的更改時,僅向服務器請求一個請求是最佳的。 如何在TableView中收聽columnMetadataCollection以便只有請求被切斷?或者我如何使用Backbone來構建我的代碼以使其正確?

回答

0

您可能想研究限制您的請求的速率,例如與TrafficCop。見http://lostechies.com/derickbailey/2012/03/20/trafficcop-a-jquery-plugin-to-limit-ajax-requests-for-a-resource/

另一種選擇是保持,當你調用(例如)fetchresolvefail中止操作時返回的XHR參考(見http://api.jquery.com/category/deferred-object/

+1

我讀交通警察插件。它看起來會創建'inProcess [key] = traffic'數組請求,並且對於每個請求都會驗證相關資源是否已經被請求。如果是這樣,它只需將成功/錯誤回調添加到該「交通」對象,不會創建新的需求。這意味着第一個請求返回時執行所有回調。但在這裏並非如此。在這裏,我希望將集合中所有'colMetadata'模型的更改發送到服務器。那麼只有服務器可以返回正確的一組行。 – ykjs121