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

时间:2014-08-20 19:53:41

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

我有一个Backbone Collection,用户正在进行CRUD类型的活动。我希望将任何更改从传播回服务器推迟 - Collection.sync()在用户启动之前不应该发生(例如POSTING表单)。

目前,我已经能够实现动态更新而没有任何问题(通过在删除模型时调用Model.destroy()之类的内容),或Collection.add()将新模型添加到根据我的理解,我可以将{silent:true}选项传递给我的模型,阻止在.sync() / .add()期间调用.destroy(),但据我所知,可能导致一些headaches later.

我考虑过覆盖Backbone.sync,但我不确定这是否是最好的路线 - 我觉得有一些方法可以勾结一些事件,但我不确定。当然,在发布之前,我已经通过Backbone文档,带注释的来源和相关的SO问题进行了阅读,但是我试图推断出这种特殊情况。

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

编辑:

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

1 个答案:

答案 0 :(得分:1)

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

Model.destroy() does trigger a sync(),但这不应该是一个惊喜 - 它明确定义为“销毁服务器上的模型 ”,sync()在模型上执行,而不是在集合上执行。您销毁的模型将从包含它们的任何集合中删除,但除非明确询问,否则我不希望这些集合到sync()

如果你的收藏真的是sync(),当你不期待它们时,那​​么最可能的罪魁祸首就是某个地方的事件监听者。您是否添加了任何在sync()add事件发生时为您致电remove的事件监听器?如果您的收藏集{@ 1}}仅限于用户互动,您是否可以删除这些事件监听器?

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

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