更改集合上的监听器(显然听取模型更改)

时间:2014-01-30 10:56:05

标签: backbone.js marionette backbone-views backbone-model

我有一个表格数据视图,可以对每个列进行排序。由于数据量很大,我更喜欢在页面中显示几行并按需加载行。因此,当用户对页面中的列进行排序时,会向服务器发送新请求,并且会提取新数据行以进行显示。 但是用户可以使用弹出页面一次修改两列或更多列的排序类型(asc或desc),允许它修改更多列的排序类型。我试图用列的元数据集合(asc / desc和其他信息)来解决这个用例。

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

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构建我的代码以使其正确?

1 个答案:

答案 0 :(得分:0)

您可能需要考虑对请求进行速率限制,例如:与TrafficCop。见http://lostechies.com/derickbailey/2012/03/20/trafficcop-a-jquery-plugin-to-limit-ajax-requests-for-a-resource/

另一个选项是保持对您致电(例如)fetch时返回的xhr的引用,并使用resolvefail中止操作(请参阅http://api.jquery.com/category/deferred-object/ })