【问题标题】:Backbone.js - "Syncing" models between collectionsBackbone.js - 集合之间的“同步”模型
【发布时间】:2012-09-11 06:01:18
【问题描述】:

我习惯了 Spine.js,但我想试试 Backbone.js。

在 Spine 中,没有集合。只有模型。在 Spine 中,当我在不同的地方使用模型时,Spine 在我更新它们时始终保持模型彼此同步。在 Backbone 中,我发现情况并非如此。我希望你能告诉我我做错了什么!

我正在尝试创建 2 个文章集合,其中包含 3 个文章模型:

var Article = Backbone.Model.extend({});

var Articles = Backbone.Collection.extend({
  model: Article,
  localStorage: new Backbone.LocalStorage("Articles")
});

var articles1 = new Articles();
var articles2 = new Articles();

articles1.create({ id: 1, name: "Article 1" });
articles1.create({ id: 2, name: "Article 2" });
articles1.create({ id: 3, name: "Article 3" });

在 Chrome 中,我使用控制台并进行了一些实验:

articles1.size()
=> 3
articles2.size()
=> 0
articles2.fetch()
=> undefined
articles2.size()
=> 3

到目前为止一切顺利。两个合集中的第一篇文章都是“第 1 条”:

a1 = articles1.first()
=> child
a2 = articles2.first()
=> child
a1.get("name")
=> "Article 1"
a2.get("name")
=> "Article 1"

但是当我尝试更新第一个集合中的模型时,它没有与第二个集合同步:

a1.set({ name: "Article 1 - Updated" })
=> child
a1.save()
=> undefined
a1.get("name")
=> "Article 1 - Updated"
a2.get("name")
=> "Article 1"

我希望第二个集合中的模型能够自动更新。

但我可以看到两种文章模型都有不同的 cid:

a1.cid
=> "c0"
a2.cid
=> "c3"

所以我的问题是……你在 Backbone 做什么?如何让模型在集合之间保持同步?

我实际上阅读了这篇博客文章:http://destroytoday.com/blog/reasons-for-spinejs/。他写道:

动态记录

这只是疯狂的黑魔法,但它解决了我面临的一个问题 使用 Backbone.js。假设您在一个视图中获取了一条记录 应用程序。然后,您在不同的视图中获取并更新同一条记录。 在 Spine.js 中,两条记录都会更新。你不必担心 使它们保持同步。当我读到这件事的那一刻,一滴眼泪 滚下我的脸颊。

我确实尝试过搜索但没有运气。

我希望你能指出我如何以 Backbone 方式执行此操作的正确方向!

【问题讨论】:

    标签: collections backbone.js model synchronization


    【解决方案1】:

    您有 2 个基本选项:

    1. 确保两个集合都包含对完全相同的模型实例的引用。不仅是 2 个具有相同 ID 的对象,而且实际上是该记录的相同内存中单个模型实例。

    2. 使用事件绑定来尝试使集合或集合中的模型保持同步(collection1 上的添加/删除/更改/重置反过来会导致 collection2 上的添加/删除/更改/重置)。

    如果您想要脊椎行为,请让 #1 工作。也许使用实例缓存as described here

    【讨论】:

    • 感谢您的回答!我希望它被烘焙到 Backbone 中。 :-(
    • 我建议不要使用第二个选项。根据我的经验,它会导致事件意大利面和不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多