2011-05-03 55 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); 
         }