我有一个代表集合的主干视图。当此集合与服务器同步并将新模型添加到集合中时,我想隐藏集合中代表这些新模型的所有视图实例,同时继续显示旧模型的视图实例。我怎样才能做到这一点?
2 回答
当底层模型/集合发生变化时,Bbone 中的视图不会自动更新。您必须明确地监听事件:更改/销毁模型,添加/更改/删除/重置集合并调用 render()。
正如WiredPrairie
建议的那样,如果您在视图初始化期间注册了例如listenTo() 任何这些事件并显式地渲染(),则始终可以使用stopListening() 来反转效果。
另一种方法是,如果它是抑制视图显示更改的一种情况,是在视图的 render() 中手动检查哪些模型已更改并使用更改属性的先前状态以避免显示新值. 签出:model.hasChanged()
以及model.previousAttributes()
在options.previousModels
集合的情况下reset
。
我假设您在这里使用Marionette.CollectionView
or 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();
从这里开始,它归结为您希望如何管理原始集合的过滤和获取/同步。但我认为整体解决方案取决于代理/装饰器集合,并且能够将集合过滤到仅您想要的项目列表。