javascript-Backbone.js-过滤集合与多个集合
作者:互联网
我正在使用骨干.js构建一个文件管理器.它是CMS(内容管理系统)Im建筑的一部分,可通过灯箱/模式窗口进行访问.我需要显示附加到特定内容类型(如帖子)的文件,以及所有一般文件.
在这一点上,我有两个单独的集合,一个libraryCollection(所有文件)和galleryCollection(一个帖子文件).我使用此方法遇到的第一个问题是:编辑libraryCollection中的文件并将模型更改事件绑定到视图显然不会影响galleryCollection视图.
有一个更好的方法吗?我以为我需要对libraryCollection进行分页(就像在REAL分页中那样,只有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);
}
});
这将在两个集合之间同步模型,并且因为我将模型更改事件与render函数绑定在一起(未显示),所以该视图反映了库视图和图库视图之间的更改.
解决方法:
对于您来说,在单独的Backbone.js组件之间进行通信的问题的一种可能的解决方案是为我们提供事件聚合器.在聚集器模式下,诸如视图之类的组件将共享对聚集器的引用,聚集器是充当应用程序中央通信中心的对象.两个视图都没有与订阅另一个视图上的事件的视图,而是与聚合器交谈,聚合器将消息传递到预订该类型消息的任何组件.
例如,您的libraryCollection可能会在聚合器上触发fileAdded事件,从而在消息中传递新的文件对象.您的galleryCollection将订阅聚合器上的fileAdded事件,并在触发时采取一些措施,例如从服务器刷新自身或将传递的文件对象添加到自身.
这是一个excellent blog post,涵盖了事件聚合器模式.
一次将成千上万的记录加载到集合中听起来很麻烦.
标签:collections,filter,backbone-js,javascript 来源: https://codeday.me/bug/20191201/2081753.html