我使用BackBone relational作为BackBone.js.的非常有用的扩展
然而,在保存了一个具有1M关系的主干关系模型之后,我遇到了一个问题。
我看到的问题是,在model.save()之后,对集合中的每个相关模型再次触发add:。这导致我的视图出现问题,因为模型在主视图中进行了第二次渲染。
我的主视图设置如下:
//master view
initialize: function(){
_.bindAll(this, 'render', 'renderRelated');
this.model.bind('change', this.render);
this.model.bind('add:related', this.renderRelated);
}
这在第一次加载和添加新的相关模型时非常有效。问题是,当在父模型上调用save时,即使模型具有ID等,也会为每个嵌套模型再次触发add:related
。看起来save完全重新填充了相关集合。
我想知道其他人是怎么绕过这件事的?我在考虑:
- 将嵌套视图附着到每个相关模型
- bind-rm:与将从主视图中删除视图的方法相关
这对我来说似乎很棘手,效率很低,并且会在删除和再次添加子视图时给最终用户带来闪烁效果。
作为其中的一部分,我还试图绑定到reset:related
,但在保存后似乎没有触发。
我使用Backbone.Marionette视图,也遇到了类似的问题。这就是解决问题的方法:
initialize: function(){
this.bindTo(this.model, 'change', this.render);
this.bindTo(this.model.get('myrelated'), 'relational:add', this.render);
}
我认为在简单的Backbone中,这转化为(未经测试):
initialize: function(){
_.bindAll(this, 'render', 'renderRelated');
this.model.bind('change', this.render);
this.model.get('myrelated').bind('relational:add', this.render);
}
请注意,如果在保存时传递{wait: true}
,则relational:add
将被激发两次:一次是在保存前由主干创建临时模型时,另一次是保存成功并创建实际模型时。这是Relational的一个尚未解决的错误。