2013-06-18 48 views
0

我有一個模型,應該將客戶端已知模型的ID作爲數組保存到服務器,但我正在努力尋找實現此目的的好方法。Ember-Data模型應該保存非Ember-Data-Models的ID - 如何?

這裏是由客戶方已知的,因此應該與服務器同步的模型類:

App.Browser = Em.Object.extend 
    name: '' 
    id: 0 

App.Browser.reopenClass 
    all: [ 
    UI.Browser.create(id: 1, name: 'Firefox') 
    UI.Browser.create(id: 2, name: 'Chrome') 
    ] 

    find: (id) -> 
    if arguments.length == 0 
     return @all 
    else 
     @all.find((item) -> item.get('id') == id) 

是同步到服務器的模式是這樣的:

App.Thingie = DS.Model.extend 
    browserIds: DS.hasMany 'UI.Browser' # <-- this does not work, of course 

我試過到目前爲止:

  1. 編寫自定義餘燼數據本身與registerTransform綁定,映射到需要保存的每個對象的對象ID並保存結果數組。這適用於創建對象,但反序列化步驟不起作用,因爲在反序列化過程中您不知道映射ID的是哪個對象(信息在那裏不可用)。例子見[1]。
  2. 嘗試破解餘燼數據以接受與非餘燼數據模型的關聯,但沒有運氣。

我要嘗試的下一件事就是創建一個用於關聯瀏覽器對象的虛擬陣列屬性,另外還有一個將它們的id保存到同步到api的陣列的觀察者。這將不得不以2路方式工作,因爲加載的Thingie-Objects應該在從api(不僅僅是id)加載時提供相關聯的對象。

但是,也許有一個更簡單的方法來實現我在做什麼?非常感謝您的幫助。

[1] 在模型:

DS.attr 'recordArray', { defaultValue: [] } 

在適配器:

DS.MyAdapter.registerTransform('recordArray', 
    deserialize: (serialized) -> 
    console.log('this does not work', serialized) 
    serialize: (deserialized) -> 
    deserialized.map((item) -> item.get('id')) 
) 

回答

0

我要去嘗試接下來的事情將要嘗試在創建虛擬陣列屬性用於關聯瀏覽器對象,以及將其ID保存到與api同步的陣列的觀察器。這將不得不以2路方式工作,因爲加載的Thingie-Objects應該在從api(不僅僅是id)加載時提供相關聯的對象。

該方法可行。假設您的適配器將序列化browserIds到/從整數數組中,只需將browserIds定義爲模型中的計算屬性。喜歡的東西:

App.Thingie = DS.Model.extend({ 
    browserIds: function(key, value) { 
    // getter 
    if (arguments.length === 1) { 
     return this.get('browsers').getEach('id'); 
    // setter 
    } else { 
     return value.map(function(id) { 
     App.Browser.find(id); 
     }); 
    } 
    }.property('browsers') 
}) 

不過,也許還有一個更簡單的方法來實現我在做什麼?

是的,我想你在找什麼是(列舉變換)https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/adapter.js# L575-L605。像這樣的東西應該工作:

DS.MyAdapter.registerEnumTransform('browsers', App.Browser.all); 
App.Thingie = DS.Model.extend({ 
    browsers: DS.hasMany 'browsers' 
}) 

有一點要記住這裏是變換預計ID是索引到對象數組。它將完全忽略UI.Browser對象的id屬性。

另請參見(所列變換試驗)[https://github.com/emberjs/data/blob/master/packages/ember-data/tests/integration/transform_test.js#L133-L169]

+0

由於,這對我很有幫助。不幸的是,我必須應對的ID不是順序的,但我認爲當我將數組傳遞給registerEnumTransform時,我可以「欺騙」它們以獲得正確的索引。 –

+0

是的,這應該是可能的。它可能是有意義的支持ID查找的轉換,會給一些想法... –