javascript - 推迟将 Backbone.js 集合与服务器同步

标签 javascript backbone.js backbone-events backbone.js-collections backbone-model

我有一个主干集合,用户正在其上执行 CRUD 类型的事件。我想推迟任何更改传播回服务器 - Collection.sync() 不应该发生,直到用户启动它(例如 POSTING 表单)。

就目前情况而言,我已经能够毫无问题地实现即时更新(通过在删除模型时调用诸如 Model.destroy() 之类的东西,或者 Collection .add() 将新模型添加到集合中。据我了解,我可以将 {silent:true} 选项传递给我的模型,从而防止 .sync().add()/.destroy() 期间被调用,但据我所知,这可能会导致一些 headaches later.

我已经考虑过覆盖 Backbone.sync,但我不确定这是否是最佳路线 - 我觉得有某种方法可以 Hook 某些事件,但我不确定。当然,在发布本文之前,我已经阅读了 Backbone 文档、带注释的源代码和相关的 SO 问题,但在尝试推断这种特殊情况时遇到了困难。

最终,我需要在应用程序的许多地方实现这一点,这就是为什么我在此阶段关注最佳实践。我正在寻找一些有关如何继续防止立即与远程服务器同步更改的默认行为的指导/建议/想法。感谢您的帮助 - 感谢您的宝贵时间!

编辑:

我采纳了 Alex P 的重构建议:在我的集合中,我设置了一些属性来跟踪已编辑、添加或删除的模型。然后,当用户触发保存操作时,我会遍历列表并执行适当的操作。

最佳答案

第一步是确保您的集合在您怀疑时同步。默认情况下, Collection.add() 不应触发 Collection.sync() ( the method documentationlist of events 中未提及,我无法请参阅 the annotated source 中的触发器)。

Model.destroy() does trigger a sync() ,但这不足为奇 - 它被明确定义为“销毁服务器上的模型”,并且 sync() 是在模型上执行的,而不是在收藏。您销毁的模型将从包含它们的任何集合中删除,但除非明确要求,否则我不希望这些集合进行 sync()

如果您的集合确实在您不期望的情况下进行了 sync()ing,那么最有可能的罪魁祸首是某处的事件监听器。您是否添加了在看到 addremove 事件时为您调用 sync() 的事件监听器?如果您的集合应该仅在用户交互时 sync() ,您可以删除这些事件监听器吗?

如果没有,那么将 {silent: true} 传递到您的方法中可能是一种可行的方法。但请记住,这只是阻止事件发出 - 它并没有阻止代码运行。如果除事件监听器之外的其他事件正在触发您的 sync(),那么阻止这些事件的发出并不能阻止它们。

还值得考虑对您的应用程序进行更广泛的重构。现在,您立即修改集合和模型,并尝试延迟所有 sync() 直到用户单击按钮之后。如果您缓存了所有要销毁的模型和要添加的项目的列表,并且仅在单击按钮时执行操作,该怎么办?存储模型 ID 足以销毁它们,并且存储集合 ID 和模型 ID 可以让您添加项目。这也意味着如果用户决定不保存更改,您不必再次fetch() 集合。

关于javascript - 推迟将 Backbone.js 集合与服务器同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25413313/

相关文章:

javascript - 无论用户输入如何,我的输出始终是数组中的第一项

javascript - 检查对象或数组中是否存在值

javascript - 如何使用Queue.js和D3.js加载多个文件?

javascript - 如何在 backbone.js 回调中从模型中分离一些响应数据

javascript - 如何将自定义 HTTP header 添加到 BackboneJS 模型中的所有 AJAX 调用?

javascript - 避免在主干事件处理程序中使用 event.preventDefault() 样板

javascript - 使用 Node.js 更好地理解回调

backbone.js - 将 iscroll v5 与 requirejs 一起使用

backbone.js - Backbone 在一次事件中触发两种方法

ruby-on-rails-3 - 在backbone.js中,我如何将keyup绑定(bind)到文档