0

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

var Mdl = Backbone.Model.extend({

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

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

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

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

谢谢。

4

2 回答 2

0

首先,如果您ObjectsModel.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" ) );
  }
});

检查这个 SO 问题

看到这Model.get("test_data")是原始数据,而真正的 Object 是Model.test,最后一个不包含在Model.attributes.

于 2012-05-15T10:44:42.710 回答
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
});

然后它将您的测试属性转换为主干集合。

于 2012-05-15T11:11:34.340 回答