通过signalr从骨干返回嵌套模型会丢弃属性属性

时间:2013-11-22 00:16:57

标签: backbone.js model signalr fetch

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

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

model.attributes.nestedModel.attributes.attributeName

当我从信号器通过

检索模型时
model.fetch()

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

model.attributes.nestedModel.attributeName

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

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

BTW,我正在使用backbone.signalr nuget包。

感谢。

1 个答案:

答案 0 :(得分:0)

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

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

骨干网不够聪明,无法弄清楚nestedModel实际上是一个“模型”。它将“nestedModel”视为Model上的属性。 (它只是一个常规的JSON对象,而不是骨干对象)

这就是为什么:

model.attributes.nestedModel.attributes.attributeName

不起作用。

要使其工作,您必须将nestedModel实例化为Backbone Model。所以在完成提取之后:(假设你的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