2012-05-15 49 views
0

如果我有一些参数是集合的典范,作为一个例子:骨干JS模型响应阵列骨干收集

var Mdl = Backbone.Model.extend({ 

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

现在可以说,我做一个获取这个模型,并在我的服务器端响应我有一个属性称为“测试”,这是一个数组。我想将数组添加到我的集合中,或者将它重置为这个数组,以便它仍然是一个骨干集合,但是这不是默认完成的,如果我按照预期在我的模型上运行重置,它会覆盖“测试”属性与响应中的数组。

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

我可以通过创建自己的Backbone Sync来做到这一点,但我不确定这是否是最好的方法来解决它,你们觉得呢?

谢谢。

+0

您不需要Sync的覆盖。 Backbone提供了解析方法,它采用'response' http://documentcloud.github.com/backbone/#Model-parse你将不得不编写代码来做你现在想做的事 – Deeptechtons

+0

你真的这么做吗? 'new Backbone.Collection()'我宁愿像下面那样创建一个集合的实例。 'var tstCol = Backbone.Collection.extend({}); ...默认值:{test:new tstCol()} ... – Deeptechtons

回答

0

如果您在Model.defaultscheck this answer中定义了Objects,那么您首先会遇到奇怪的问题。

如果你真的想这样做,尝试做一个延时功能:

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

尽管如此,我认为是不是一个好主意,我真的希望有在Model.attributes我觉得基本的价值观是什么骨干正在期待。

我在此情况下,做的是使服务器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中。

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 
}); 

然后它会将您的测试属性变为骨干集合。