问题是:文档很少,我有点傻——有人能确认绑定Backbone.Views到Backbone.RelationalModel实例(来自backboneRelational.js)的正确方法吗?基于Backbone中的普通模型/视图绑定,我尝试了几种不同的方法,但收效甚微。
背景故事(/更多信息):我正在学习Backbone.js的诀窍,在过去的一周里我学到了很多。如果我遗漏了一些明显的东西(很可能——包括下面处理问题的"正确"方法),请给我打电话。
我正在处理一个支持mongodb的REST接口(我不能完全控制它,否则我将在服务器端重新构建行为),它充分利用了嵌套字典的优势,所以我一直在学习如何在Backbone中最好地表示它(同时不破坏Backbone提供的伟大的save()+服务器同步功能)。
我看到了两种选择:主干关系和ligament.js.
我从backbone-relational.js开始,并为REST接口返回的树中的各种字典创建了RelationalModels(骨干关系模型取代了backbone的标准模型)。它们之间的关系已经定义,控制台记录每个模型的JSON(在它们各自的初始化函数中)表明,在整个集合级别上,它们都是通过fetch()命令从服务器上正确调用/加载的。
所以,这一切都很棒。
问题:我有一些视图在"监听"每个模型的更新(以及应该在dom上渲染模板的绑定函数),它们根本不会"启动"(更不用说渲染…)。主视图在fetch()上启动,没问题,加载"顶级"模型并在dom上渲染它——但表示该"顶级"模式中的"外键"模式的视图永远不会这样做(即使数据肯定会加载到每个模型中,正如上面提到的控制台登录每个模型所证明的那样)。
任何见解都将不胜感激。
直接回复Raynos回复如下(感谢Raynos!):如果我为UpperLevelCollection定义了一个基本url,并且服务器上的(UpperLevel.Collection url)/(UpperLevelModel id)中存在UpperLevel_Models,我将如何从服务器端将这些LowerLevelCollections映射到每个UpperLeveL_Model的一个JSON转储中的字典键?换句话说,在模型中使用集合是否可以像这样正确地处理来自服务器的数据转储(显然非常简单,但解决了这个问题),并正确地保存/更新/同步它?
[{
"some_key": "Some string",
"labels": ["A","List","Of","Strings"],
"content": [{
"id": "12345"
"another_key": "Some string",
"list": ["A","list","of","strings"],
},{
"id": "67890"
"another_key": "Some string",
"list": ["A","list","of","strings"],
}],
}]
通常,对于嵌套字典,我采用以下方法
var UpperLevelCollection = Backbone.Collection.extend({
model: UpperLevelModel
}),
UpperLevelModel = Backbone.model.extend({
initialize: function() {
this.nested = new LowerLevelCollection;
}
}),
LowerLevelCollection = Backbone.Collection.extend({
model: LowerLevelModel
}),
LowerLevelModel = Backbone.Model.extend({});
只需将这些集合一直嵌套在模型中即可。
问题可能是,当您将新数据加载到ParentModel中时,您的子集合AFAIK实际上并没有被提取,而是被擦除并替换为一个新集合(请参阅Backbone.HasMany.OnChange,主干关系.js中第584行)。因此,您自己对子集合的绑定就消失了。
在我看来,这是骨干关系的弱点。这种行为应该是可配置的,可以选择使用较慢的查找和更新方法,而不是擦除和替换。