Backbone.js-过滤集合与多个集合

Backbone.js - Filtering Collections versus multiple Collections

本文关键字:集合 Backbone 过滤 js-      更新时间:2023-09-26

我正在使用backbone.js构建一个文件管理器。它是CMS(内容管理系统)Im构建的一部分,可以通过灯箱/模式窗口访问。我需要显示附加到特定内容类型(如帖子)的两个文件,以及通常的所有文件。

在这一点上,我有两个独立的集合,一个libraryCollection(所有文件)和galleryCollection(发布文件)。使用此方法遇到的第一个问题是:编辑libraryCollection中的文件并将模型更改事件绑定到视图显然不会影响galleryCollection视图。

有更好的方法吗?我想我需要对libraryCollection进行分页(就像在真正的分页中一样,只有xx个从服务器检索到的结果),这可能会使事情复杂化。除非将潜在的数千条记录加载到集合中是可以的?

更新:

最快(可能是最脏)的方法是使用内置的Backbone.Events系统。样本代码:

var aggregator = {};
_.extend(aggregator, Backbone.Events);
aggregator.on("fileUpdated", function(model){
    if(app.libraryCollection && app.galleryCollection){
        libraryModel = app.libraryCollection.get(model.get("id"));
        galleryModel = app.galleryCollection.get(model.get("id"));
        libraryModel.set(model.attributes);
        galleryModel.set(model.attributes);
    }   
});

然后编辑器视图:

window.EditorView = Backbone.View.extend({
    saveModel: function(){
        self = this;
        form = $(this.el).find("form").serializeArray();
        _.each(form, function(field){
            self.model.set(field["name"], field["value"]);
        });
        self.model.save();
        aggregator.trigger("fileUpdated", this.model);
    }
});

这将同步两个集合中的模型,并且由于我将模型更改事件与呈现函数(未显示)绑定,因此视图将反映库视图和库视图中的更改。

解决您在单独的Backbone.js组件之间通信问题的一个潜在解决方案是为我们提供一个事件聚合器。在事件聚合器模式中,视图等组件将共享对聚合器的引用,聚合器是一个充当应用程序中央通信中心的对象。两个视图都与聚合器对话,而不是一个视图订阅另一个视图上的事件,聚合器将消息传递给订阅该类型消息的任何组件。

例如,libraryCollection可能会在聚合器上激发fileAdded事件,在消息中传递新的file对象。您的galleryCollection将订阅聚合器上的fileAdded事件,并且它将在触发时采取一些操作,例如从服务器刷新自身或将传递的file对象添加到自身。

这里有一篇优秀的博客文章,介绍了事件聚合器模式。

一次将数千张唱片加载到一个收藏集听起来像是一个麻烦的处方。