是否可以在 Backbone.js 中延迟获取集合中的模型,同时有时获取(和发布)整个集合

Is it possible to lazily fetch models in a Collection in Backbone.js, while sometimes fetching (and releasing) the whole collection?

本文关键字:集合 获取 模型 Backbone js 是否 延迟      更新时间:2023-09-26

这是我的场景:

我正在使用骨干.js。

有几个大型数据集合,我宁愿不要一直保存在内存中。 因此,涉及始终将我所有集合中的所有模型保存在内存中的解决方案并不好。

我需要能够显示和/或编辑这些集合中的任意记录,并且我需要同一模型的多个视图指向同一记录(以便它们保持同步)。 因此,最好从主集合中提取这些模型,而不是执行 Model.fetches。

现在,看起来我可以使用 Collection.fetch 根据需要拉取这些记录,方法是将 ajax 数据设置与 {add: true} 选项结合使用。 如果它能完成工作,这将使我达到我想要的一半。

麻烦的是,在任何给定的时间点,我可能需要为其中一个集合拉出一个选取器列表视图,并临时显示该特定集合的所有记录(或者,如果它真的很大,则显示分页列表)。 当我需要展示所有集合时,我可以获取整个集合(或集合的一页) - 太好了。 但是,当我完成该选取器视图时,我需要清除这些额外的记录。 如何清理它们,同时又不丢失我之前获取的个人记录模型的跟踪?

到目前为止,我梦寐以求的最佳解决方案是保留我的临时记录数组,并在调用 reset 清理它时将其传递给集合。 这还需要我对这些模型保留某种参考计数,以便我知道何时将它们从集合中删除。 对我来说,这似乎是很多簿记。 有没有更清洁的方法来解决这个问题?

看完你的最后一条评论后,我想我理解你。所以,试图重写你的问题,你所拥有的是:

  • 模型实例化并分配给局部变量
  • 集合包含已分配给局部变量的模型以及其他模型

但是,局部变量集合中的相同模型是不同的实例,因此一个引用中的更改不会影响另一个引用。这就是您要解决的问题。

因此,我们必须尝试的是局部变量和集合中的引用是相同的引用

一种方法是,initialize()中的集合可以检查其所有模型,并将最近获取的模型替换为已实例化的模型(如果id匹配,并且如果尚不存在)。

为此,我们有一些如何要求已缓存模型的列表。但是这个已经缓存的模型都是在一个局部变量中到不同的视图或其他什么,所以我们需要一个独特的地方,我们可以一次获得完整的列表。这个独特的地方可以是一个名为 CachedModels 的集合。

Model.initialize()中,我们可以添加一行,将当前模型添加到此CachedModels 。此外,我们必须注意维护此CachedModels集合清理或删除模型。

这不是一个非常优化,也不是很容易的方法,但我希望它能以任何方式激励你。