Backbone js模型响应数组到Backbone集合

时间:2012-05-15 09:47:54

标签: javascript backbone.js

如果我有一个模型,其中一些参数是集合,例如:

var Mdl = Backbone.Model.extend({

  defaults:{
    test: new Backbone.Collection()
  }
});

现在让我说我对这个模型进行了一次获取,并且在我的服务器端响应中,我有一个名为“test”的属性,它是一个数组。我想将数组添加到我的集合中或使用此数组重置它以使其仍然是主干集合,但是如果我在模型上运行重置,则默认情况下不会这样做,如预期的那样,它将覆盖“测试”响应中包含数组的属性。

将响应属性“test”视为主干集合而非数组的最佳方法是什么?我基本上想要检查属性是否是一个数组,然后检查属性是否已经在模型上定义为集合,如果是,则使用数组重置此集合,而不是覆盖它。

我可以通过创建自己的Backbone Sync来做到这一点,但我不确定这是否是最好的方法,你们有什么想法?

感谢。

2 个答案:

答案 0 :(得分:0)

如果您在Objects check this answer中定义Model.defaults,首先要遇到奇怪的问题。

如果您真的想这样做,请尝试在延迟功能中执行此操作:

// code no tested
var Mdl = Backbone.Model.extend({
  defaults:{
    test: function() { return new Backbone.Collection() }
  }
});

我仍然觉得这不是一个好主意,我真的更喜欢Model.attributes中的基本值,我认为是Backbone期待的。

在这种情况下我做的是让服务器JSON响应有一个名为test_data的密钥,并在Model.initialize中手动解析:

// code no tested
var Model = Backbone.Model.extend({
  initialize: function(){
    this.test = new Backbone.Collection( this.get( "test_data" ) );
  }
});

Check this SO question

看到Model.get("test_data")是原始数据且真正的对象是Model.test,最后一个不包含在Model.attributes中。

答案 1 :(得分:0)

我使用Backbone Relational来解决这类问题。

您可以编写这样的代码来定义关系。

Mdl = Backbone.RelationalModel.extend({
    relations: [{
            type: Backbone.HasMany,
            key: 'test',
            relatedModel: 'TestModel',
            collectionType: 'TestCollection',
            reverseRelation: {
                key: 'mdl'
            }
        }]
});

TestModel = Backbone.RelationalModel.extend({});

TestCollection = Backbone.Collection.extend({
    model: TestModel
});

然后它会将您的测试属性变为Backbone Collection。