5

问题:文档很少,而且我是个菜鸟——任何人都可以确认将 Backbone.Views 绑定到 Backbone.RelationalModel 实例(来自主干-relational.js)的正确(假设有一种)方法更新/渲染到 dom?我尝试了几种不同的方法,基于 Backbone 中的正常模型/视图绑定,但收效甚微。

背景故事(/更多信息): 我正在学习 Backbone.js 的诀窍,并且在过去一周不得不学习很多东西。如果我遗漏了一些明显的东西(这很可能——包括下面处理我的问题的“正确”方法),请给我打电话。

我正在处理一个 mongodb 支持的 REST 接口(我无法完全控制它——或者我会在服务器端重新设计行为),它充分利用了嵌套字典,所以我一直阅读如何在 Backbone 中最好地表示这一点(同时不破坏 Backbone 提供的出色的 save() + 服务器同步内容)。

我见过两种选择:backbone-relationalligament.js

我从backbone-relational.js 开始,并为树中由REST 接口返回的各种字典创建了RelationalModels(backbone-relational 替代Backbone 的标准模型)。它们之间的关系已定义,并且控制台记录来自每个模型的 JSON(在它们各自的初始化函数中)表明它们都在整个集合级别的 fetch() 命令上正确地从服务器调用/加载。

所以,这一切都很棒。

问题:我有视图“监听”每个模型的更新(以及应该在 dom 上渲染模板的绑定函数),它们根本不会“触发”(更不用说渲染......)。主视图在 fetch() 上触发,没问题,加载“顶级”模型并将其呈现在 dom 上——但代表该“顶级”模型中的“外键”模型的视图永远不会这样做(即使数据肯定会被加载到每个模型中,正如上面提到的每个模型上的控制台日志所证明的那样)。

任何见解将不胜感激。

直接响应下面的 Raynos 回复(感谢 Raynos!): 如果我为 UpperLevelCollection 定义了一个基本 url,其中 UpperLevelModels 存在于服务器上的(UpperLevelCollection url)/(UpperLevelModel id),我将如何将这些 LowerLevelCollection 映射到其中的字典键来自服务器端的每个 UpperLevelModel 的一个 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"],
    }],
}]
4

2 回答 2

2

通常对于嵌套字典,我采用以下方法

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({});

只需将这些集合一直嵌套在模型中即可。

于 2011-06-21T22:40:03.633 回答
1

问题可能是,当您将新数据加载到 ParentModel 中时,您的子集合 AFAIK 并没有真正获取,它被擦除并替换为新集合(请参阅主干-relational.js 中第 584 行的 Backbone.HasMany.OnChange)。因此,您自己对子集合的绑定消失了。

在我看来,这是骨干关系的一个弱点。此行为应该是可配置的,可以选择使用较慢的查找和更新方法而不是擦除和替换。

于 2012-01-10T09:29:23.660 回答