【问题标题】:Backbone-relational.js + Backbone.View(s)Backbone-relational.js + Backbone.View(s)
【发布时间】:2011-06-21 22:23:34
【问题描述】:

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

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

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

我见过两个选项:backbone-relationalligament.js

我从主干关系.js 开始,并为由 REST 接口返回的树中的各种字典创建了 RelationalModels(主干关系替代主干的标准模型)。它们之间的关系已定义,并且控制台记录来自每个模型的 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"],
    }],
}]

【问题讨论】:

    标签: javascript backbone.js backbone-relational


    【解决方案1】:

    一般对于嵌套字典我采取以下方法

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

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

    【讨论】:

    • 谢谢雷诺斯。这就是我最初接近它的方式,但有点担心如果 UpperLevelModel(s) 的 url 实际上返回了完整的树(LowerLevelModels 列在“内容”键)。我已经在我的原始帖子中添加了一个块(这里的回复字符太多)。再次感谢您的帮助 - 我已经超出了我的深度(显然)。
    • @ltd override .parse example and override .toJSON 使数据的读写工作。 toJSON 应该在保存时返回要发送到 mongo 的对象(不是 json 字符串)。
    • 太好了——再次感谢。我已经按照您的建议制定了模型,并且在数据方面似乎一切都很好。现在,最后一个问题(我希望):将 UpperLevelModel 视图中的添加/刷新/等事件绑定到 LowerLevelModel/Collection 的正确方法是什么?在顶级应用程序视图级别,我可以绑定这些事件以呈现 UpperLevelModel 视图,但在涉及子模型/视图时遇到了一些麻烦。或者,我应该只在单个视图中呈现 UpperLevelModel(包括子集合/模型)吗?
    • @ltd 含糊不清,无法提出最佳解决方案。使用代码示例将其作为一个新问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      相关资源
      最近更新 更多