【问题标题】:Returning nested model from backbone via signalr drops attribute property通过信号器从主干返回嵌套模型丢弃属性属性
【发布时间】:2013-11-22 00:16:56
【问题描述】:

我正在研究骨干网/信号 POC。我有非常简单的模型工作,我可以在客户端创建它们并通过信号器检索它们。 问题是这样的:

如果我使用嵌套模型创建模型的客户端版本,我可以像这样访问属性:

model.attributes.nestedModel.attributes.attributeName

当我通过信号器检索模型时

model.fetch()

模型回来了,但现在要访问我需要使用的嵌套模型属性

model.attributes.nestedModel.attributeName

嵌套模型的属性级别被删除,因此导致模板渲染失败

我该如何解决这个问题?难道我做错了什么?我是信号器/骨干网的新手。

顺便说一句,我正在使用backbone.signalr nuget包。

谢谢。

【问题讨论】:

    标签: backbone.js model signalr fetch


    【解决方案1】:

    这是因为当你使用 fetch() 时,服务器只返回一个带有模型属性和嵌套模型属性的 JSON 对象。例如,服务器返回:

    {
      id: "1",
      name: "Model",
      nestedModel: {
        id: "12",
        name: "nestedModel"
      }
    }
    

    backbone 不够聪明,无法确定 nestedModel 实际上是一个“模型”。它将“nestedModel”视为模型上的一个属性。 (它只是一个普通的 JSON 对象,不是骨干对象)

    这就是为什么:

    model.attributes.nestedModel.attributes.attributeName
    

    不起作用。

    要使其工作,您必须将nestedModel 实例化为Backbone 模型。所以在 fetch 完成后:(假设你的 nestedModel 是 NestedModel 的一个实例)

    model.fetch().done(function() {
      model.set('nestedModel', new NestedModel(model.get('nestedModel')));
    });
    

    您可以通过覆盖 parse() 方法让主干自动为您执行此操作。

    在你的模型中:

    var NestedModel = Backbone.Model.extend({
      //your nested model methods
    });
    
    var Model = Backbone.Model.extend({
      //do other model stuff
    
      parse: function(response) {
        response.nestedModel = new NestedModel(response.nestedModel);
        return response;
      }
    }); 
    

    这应该使您的陈述有效。 但通常我会使用

    model.get('nestedModel').get('attributeName')
    

    有关解析的更多信息,请参见此处:http://backbonejs.org/#Model-parse

    为了更灵活地将这种模式应用到所有其他模型中,您可能想阅读以下内容: http://www.devmynd.com/blog/2013-6-backbone-js-with-a-spine-part-2-models-and-collections

    【讨论】:

    • 这太棒了,谢谢。我知道原因,但我不确定在客户端处理它的最佳方法是什么。覆盖解析是处理它的好方法。
    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多