【发布时间】:2012-11-07 16:50:29
【问题描述】:
我通过运行 collection.fetch() 方法初始化了一个主干集合,然后过了一会儿,我要求集合再次获取以刷新模型。那么,是否有任何来自 Model 的事件被触发,我可以从 View 订阅以删除/更新视图。
【问题讨论】:
标签: backbone.js backbone.js-collections
我通过运行 collection.fetch() 方法初始化了一个主干集合,然后过了一会儿,我要求集合再次获取以刷新模型。那么,是否有任何来自 Model 的事件被触发,我可以从 View 订阅以删除/更新视图。
【问题讨论】:
标签: backbone.js backbone.js-collections
没有特定的“集合已被重新获取”事件,但您不需要。 fetch 重置集合:
获取
collection.fetch([options])
[...]
当模型数据从服务器返回时,集合将重置。
而reset 触发"reset" 事件:
重置
collection.reset(models, [options])
[...]
使用 reset 将集合替换为新的模型列表(或属性哈希),最后触发单个"reset"事件。
因此,只需从集合中侦听 "reset" 事件,并在收到时重新渲染视图。
fetch 的行为在 Backbone 1.0 中发生了变化,从 ChangeLog:
- 将 Collection 的“更新”重命名为 set,以便与类似的
model.set()并行,并与 reset 进行对比。它现在是 fetch 之后的默认更新机制。如果您想继续使用“重置”,请传递{reset: true}。
如果我们查看set:
设置
collection.set(models, [options])set 方法使用传递的模型列表对集合执行“智能”更新。如果列表中的模型尚未在集合中,它将被添加;如果模型已经在集合中,它的属性将被合并;如果集合包含列表中不存在的任何模型,它们将被删除。发生这种情况时会触发所有相应的
"add"、"remove"和"change"事件。
因此,如果您想继续使用"reset" 事件,可以说collection.fetch({ reset: true }),或者您可以collection.fetch() 并监听个别"add"、"remove" 和"change" 事件。
【讨论】:
fetch 的工作方式,现在是 "uses set to (intelligently) merge the fetched models, unless you pass {reset: true}, in which case the collection will be (efficiently) reset."。因此,您可以使用 reset:true 选项或监听单个 "add" 或 "remove" 事件。您可能还注意到 在这个答案之后发布了 1.0。