2015-08-21 75 views
1

我有一個數據結構如下從服務器返回我正在寫的一些過濾功能。每個過濾器組都有多個過濾器。Ember數據JSONAPI複雜屬性數據

data: [ 
    { 
     type: "filter-group", 
     id: "556d7f5fa1f9de08500ef4e8_1", 
     attributes: { 
      name: "Colour", 
      created-date: "0001-01-01T00:00:00Z", 
      active: true, 
      filters: [ 
       { 
        id: "556d7f5fa1f9de08500ef4e8_1_1", 
        name: "Red", 
        created-date: "0001-01-01T00:00:00Z", 
        active: true 
       }, 
       { 
        id: "556d7f5fa1f9de08500ef4e8_1_2", 
        name: "Blue", 
        created-date: "0001-01-01T00:00:00Z", 
        active: true 
       }, 
       { 
        id: "556d7f5fa1f9de08500ef4e8_1_3", 
        name: "Green", 
        created-date: "0001-01-01T00:00:00Z", 
        active: true 
       } 
      ] 
     } 
    } 
] 

而且我有模型設置爲這樣:

// models/filter-group.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    active: DS.attr('boolean'), 
    client: DS.belongsTo('client', { embedded: 'always' }), 
    filters: DS.hasMany('filter', { embedded: 'always' }) 
}); 

和:

// models/filter.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    active: DS.attr('boolean'), 
    createdDate: DS.attr('date'), 
    filterGroup: DS.belongsTo('filter-group', { embedded: 'always' }) 
}); 

我是新來與JSONAPI工作,所以我不知道如果我的數據設置是正確的方式去做這件事。我通過過濾器組,然後在內部的每個,遍歷其可用過濾器試圖循環,使用下面的把手模板:

{{#each filterGroups as |filterGroup|}} 
    <h6>{{filterGroup.name}}</h6> 

    {{#each filterGroup.filters as |filter|}} 
     -- Filter output here -- 
    {{/each}} 
{{/each}} 

但每次filterGroup.filters對象爲空。我在這裏做錯了什麼?我完全誤解了JSONAPISerializer在這樣的結構上的工作方式嗎?

回答

3

在JSON API中,雖然可以在屬性中嵌入數據,但不能/不應該嵌入完整的資源對象(即具有自己的type,relationships等的對象)。我猜這就是絆倒Ember Data的原因。

相反,JSON API會要求您將這些嵌入式資源置於included集合中(請參見下文)。這允許主數據中的多個資源引用相同的included資源,而不需要在有效負載中多次包括該資源。因此,服務器的響應應該是這樣的:

{ 
    "data": [{ 
    "type": "filter-group", 
    "id": "556d7f5fa1f9de08500ef4e8_1", 
    "attributes": { 
     "name": "Colour", 
     "created-date": "0001-01-01T00:00:00Z", 
     "active": true 
    }, 
    "relationships": { 
     "filters": { 
     "data": [ 
      {"type": "filters", "id": "556d7f5fa1f9de08500ef4e8_1_1"}, 
      {"type": "filters", "id": "556d7f5fa1f9de08500ef4e8_1_2"}, 
      {"type": "filters", "id": "556d7f5fa1f9de08500ef4e8_1_3"} 
     ] 
     } 
    } 
    }], 
    "included": [{ 
    "type": "filters", 
    "id": "556d7f5fa1f9de08500ef4e8_1_1", 
    "attributes": { 
     "name": "Red", 
     "created-date": "0001-01-01T00:00:00Z", 
     "active": true 
    } 
    }, { 
    "type": "filters", 
    "id": "556d7f5fa1f9de08500ef4e8_1_2", 
    "attributes": { 
     "name": "Blue", 
     "created-date": "0001-01-01T00:00:00Z", 
     "active": true 
    } 
    }, { 
    "type": "filters", 
    "id": "556d7f5fa1f9de08500ef4e8_1_3", 
    "attributes": { 
     "name": "Green", 
     "created-date": "0001-01-01T00:00:00Z", 
     "active": true 
    } 
    }] 
} 

然後,你可能必須使用比在灰燼數據embedded標誌以外的東西把它撿起包括資源 - 我不知道。但是這絕對是通過JSON API來實現的。

+0

剛剛進入辦公室,並給了這個嘗試。你有它幾乎正確,但「包含」的對象需要遵循相同的JSONAPI結構作爲常規數據,即。用「id」,「type」,然後是「attributes」對象。給了我一個很好的開始讓它工作的地方。我編輯了你的答案,以包含這些變化:) –

+0

哦,你不需要使用{embedded:'always'}。 –

+0

D'oh,當然'included'也需要'屬性'。趕上@MalabarFront,我很高興它現在幾乎可以工作:) – Ethan