我有一个代表集合的Backbone视图。当此集合与服务器同步,并且新模型被添加到集合中时,我想隐藏代表集合中这些新模型的所有视图实例,同时继续显示旧模型的视图实例。我怎么能这样做?
答案 0 :(得分:0)
更改基础模型/集合时,Bbone中的视图不会自动更新。您必须显式侦听事件:更改/销毁模型并添加/更改/删除/重置集合并调用render()。
如WiredPrairie
所示,如果你在视图初始化期间注册了例如listenTo()这些事件中的任何一个并且显式地渲染(),你总是可以使用stopListening()来反转效果。
另一种方法是,如果它是抑制视图显示更改的一种情况,则在视图的render()中手动检查哪些模型已更改,并使用更改属性的先前状态以避免显示新的价值观。如果是集合model.hasChanged()
,请查看model.previousAttributes()
和options.previousModels
以及reset
。
答案 1 :(得分:0)
我假设你在这里使用Marionette.CollectionView
或Marionette.CompositeView
,对吗?在这种情况下,你试图阻止这些显示新添加的模型,当从服务器返回并添加到你的集合中时,对吧?
我可以看到一些不同的方法,其中大多数开始于同一个地方:一个基于一个属性过滤的集合,告诉你是否显示模型。你需要在模型上有一些数据告诉你是否要显示它们......我不确定这看起来像什么样的副手,但是一旦你为此设置逻辑,我认为其余部分变得更容易了。
我在CompositeView或CollectionView中处理此方法的首选方法是使用代理集合创建视图实例 - 根据显示或隐藏模型的值进行过滤。
之前我已经讨论过代理集合了,我有一个工作的JSFiddle来展示如何构建它们,在这里:http://jsfiddle.net/derickbailey/7tvzF/
您可以设置这样的过滤集合,然后将过滤后的集合发送到您的实际视图实例:
var filtered = new FilteredCollection(myOriginalCollection);
filtered.filter({
showThisOne: true
});
var view = new MyCompositeView({
collection: filtered
});
myOriginalCollection.fetch();
从这里开始,它归结为您希望如何管理原始集合的过滤和提取/同步。但我认为整体解决方案取决于代理/装饰器集合,并且能够将集合过滤到只有您想要的项目列表。