2011-05-03 38 views
21

我已经遇到了与骨干头痛。我收集了一些指定的记录,其中有子记录,例如:外科医生有预定的程序,程序有设备,有些设备有消耗品需求(气体,液体等)。如果我有一个Backbone集合外科医生,那么每个外科医生都有一个模型 - 但是他的程序和设备以及消耗品在从JSON解包之后将全部是简单的Javascript数组和对象。任何有关Backbone的深层数据结构建议?

我想我可以在SurgeonsCollection中使用parse()来制作新的ProcedureCollections,然后制作新的EquipmentCollections,但过了一段时间后,这变成了一个毛球。为了使服务器端更明智,有一个接触点需要一位外科医生和他的东西作为POST--所以在ConsumableModel上自动传播'set'以在层次结构中触发'保存'也会使整个分层方法模糊。

有没有其他人遇到过这样的问题?你是如何解决它的?

回答

15

这可能是在你的情况下有所帮助:https://github.com/PaulUithol/Backbone-relational

您指定的关系1:1,1:N,N:N,它会相应地解析JSON。它还创建一个全球商店来跟踪所有记录。

+3

[Ligament.js](https://github.com/dbrady/ligament.js)是另一种可能的解决方案。 – user240515 2011-05-03 17:56:20

+0

骨干关系几乎完全是我梦想的答案。我很早就走上了这条路,但这是更好的思想和更优雅。 – 2011-05-03 19:14:23

2

我会将不同的外科医生,程序,设备等作为Web服务中不同的资源分离出来。如果您只需要更新特定过程的设备,则可以更新该过程。另外,如果您并不总是需要所有信息,那么我也会根据需要延迟加载数据,但在需要提高性能的位置发送完全填充的对象。

+2

我只想评论说你的建议,而值得称赞的,违背了一个RESTful接口的用途,其中粗文件(在这种情况下,过程)在服务器和客户端之间来回传递。 – 2011-05-26 23:25:04

4

所以,一个方式,我解决了这个问题是通过执行以下操作:

  1. 拥有全系车型从定制BaseModel继承,并把下面的函数在BaseModel:

    convertToModel: function(dataType, modelType) { 
         if (this.get(dataType)) { 
          var map = { }; 
          map[dataType] = new modelType(this.get(dataType)); 
          this.set(map); 
         } 
        } 
    
  2. 覆盖Backbone.sync并首先让模型序列化,因为它通常会:

    model.set(response,{silent:true});

  3. 然后检查,看是否该模型具有的onUpdate功能:

      if (model.onUpdate) { 
           model.onUpdate(); 
          } 
    
  4. 然后,只要你有,你想生成子模型和子集的模型,在模型中实现的onUpdate像这样的东西:

     onUpdate: function() { 
          this.convertToModel('nameOfAttribute1', SomeCustomModel1); 
          this.convertToModel('nameOfAttribute2', SomeCustomModel2); 
         }