使用Backbone.Marionette和Backbone.ioSync使用Backbone.Relational获取后的fetchRelated

时间:2012-05-09 04:24:39

标签: javascript backbone.js socket.io backbone-relational marionette

我正在使用Backbone.Marionette和Backbone.ioSync的Backbone.Relational来通过socket.io进行同步。

更具体地说,我有一个模型A hasMany模式B实例通过关系bees。在加载时,一切都很好:数据已初始化并正确呈现。然后,另一个客户端将B的另一个实例添加到A.bees。服务器向第一个客户端发送ping,使其调用A.fetch()。在获取的成功方法中,我调用了A.fetchRelated('bees')。 fetch方法仅返回bees关系的ID列表,在change上触发A,导致Backbone.Marionatte的集合视图创建项目视图的新实例以显示新的B,由于尚未提取新的B,因此会破坏网站。

试图强制渲染B的视图以在A中定义的延迟对象上进行同步,这听起来像是一个复杂的黑客,可能需要处理许多边缘情况。

一个想法是允许fetch接受silent选项。但在change的{​​{1}}函数中触发addsuccess事件可能很棘手。

另一个想法是在服务器上下文感知上生成序列化代码,并在添加新项目时发送整个对象,而不仅仅是ID。这也是次优的,因为当它们被添加到不同的A时,它可能导致整个相同B的不必要的转移。它还为服务器代码增加了很多复杂性,因为上下文需要在整个序列化过程中传播。

有关如何处理此问题的任何想法或建议?我愿意接受可能需要更改Backbone.Marionette或Backbone.Relational的解决方案,只要它有效。

1 个答案:

答案 0 :(得分:0)

Marionette现在拥有Marionette.Async,可以更轻松地执行异步提取和fetchRelated请求。此外,Backbone-Relational中存在一个错误,它在保存具有silent的对象时不遵守主干自动传递的wait: true选项。请参阅https://github.com/PaulUithol/Backbone-relational/pull/153了解拉取请求以解决此问题。