Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何初始化嵌套的Backbone.js模型_Backbone.js - Fatal编程技术网

如何初始化嵌套的Backbone.js模型

如何初始化嵌套的Backbone.js模型,backbone.js,Backbone.js,在我的应用程序中,我有以下JSON数据格式: { Item: { property1: '', ... } } 按照stackoverflow.com answer的解决方案,我以以下方式对Backbond.js模型进行建模: App.Models.Item = Backbone.Model.extend({ }); App.Models.ItemData = Backbone.Model.extend({ defaults: {

在我的应用程序中,我有以下JSON数据格式:

{
    Item: {
        property1: '',
        ...
    }
}
按照stackoverflow.com answer的解决方案,我以以下方式对Backbond.js模型进行建模:

App.Models.Item = Backbone.Model.extend({

});

App.Models.ItemData = Backbone.Model.extend({
    defaults: {
        'Item': new App.Models.Item
    }
});
var item = App.Models.ItemData({
    {Item: 
        {property1: 'data'}
    }
});
现在,我希望通过以下方式从页面上的后端系统将数据引导到我的应用程序:

App.Models.Item = Backbone.Model.extend({

});

App.Models.ItemData = Backbone.Model.extend({
    defaults: {
        'Item': new App.Models.Item
    }
});
var item = App.Models.ItemData({
    {Item: 
        {property1: 'data'}
    }
});
现在的问题是
item.get('item')
返回一个普通的JavaScrip对象,而不是主干.Model对象,因为默认值被覆盖如何创建Backbone.js对象,同时确保
item.get('item')
是App.Models.item对象?

我还读到,如果你嵌套主干.Models,你应该编写定制的getter方法,这样你的应用程序的其余部分就不必知道内部数据结构。如果是这样,实现这些setter和getter的正确方法是什么?

您可以在
ItemData
模型上重写该方法。不需要
默认值
。如果未传递空模型,则parse方法将初始化空模型:

App.Models.ItemData = Backbone.Model.extend({
   parse: function(attrs) {
     attrs = attrs || {};
     if(!(attrs.Item instanceof App.Models.Item))
       attrs.Item = new App.Models.Item(attrs.Item);

     return attrs;
   }
});
然后使用选项
parse:true
初始化您的
ItemData
模型:

var item = new App.Models.ItemData({Item:{property1: 'data'}}, {parse:true});

谢谢你的快速回复!只有两个小问题:1。为什么我们需要
attrs=attrs | |{}?2.我必须将
if(!attrs.Item instanceof App.Models.Item)
更改为
if(!(attrs.Item instanceof App.Models.Item))
才能工作。这是怎么回事?@wowpatrick,将
attrs
默认为
{}
只是一种保护,以防有人将空/未定义的值传递给该方法,在这种情况下,属性访问
attrs.Item
将导致错误。您也可以执行
if(attrs){…}
操作,但我通常是这样做的。还为
instanceof
检查添加了缺少的括号,对此表示抱歉。没有帕伦斯,
!首先计算attrs.Item
,并返回一个布尔值,该值从来不是
instanceof
任何东西。我认为在实例化ItemData模型时,您还需要一个“new”。当然,ouch@robmisio。我只是从OP的帖子中复制了实例化,没有检查。懒惰会咬人。