我正在使用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}}函数中触发add
和success
事件可能很棘手。
另一个想法是在服务器上下文感知上生成序列化代码,并在添加新项目时发送整个对象,而不仅仅是ID。这也是次优的,因为当它们被添加到不同的A时,它可能导致整个相同B的不必要的转移。它还为服务器代码增加了很多复杂性,因为上下文需要在整个序列化过程中传播。
有关如何处理此问题的任何想法或建议?我愿意接受可能需要更改Backbone.Marionette或Backbone.Relational的解决方案,只要它有效。
答案 0 :(得分:0)
Marionette现在拥有Marionette.Async,可以更轻松地执行异步提取和fetchRelated请求。此外,Backbone-Relational中存在一个错误,它在保存具有silent
的对象时不遵守主干自动传递的wait: true
选项。请参阅https://github.com/PaulUithol/Backbone-relational/pull/153了解拉取请求以解决此问题。