2017-02-10 34 views
0

我是jsonapi的新手,以及結構是如何工作的,並試圖讓關係正確加載。我期待的燼數據遵循提供的URL在我的對象的relationship.links來獲取所需的信息,但我得到意想不到的結果。如何構建我的Ember模型和API數據以表示關係中的數據?

我有用戶,領域,並這樣定義一個用戶/區域關係:

// User Model 
const UserModel = DS.Model.extend({ 
    username: DS.attr('string'), 
    territories: DS.hasMany('user-territories') 
} 

// Territory Model 
const TerritoryModel = DS.Model.extend({ 
    name: DS.attr('string') 
} 

// User-Territory Model 
const UserTerritoryModel = DS.Model.extend({ 
    notes: DS.attr('string'), 
    startDate: DS.attr('date'), 
    user: DS.belongsTo('user'), 
    territory: DS.belongsTo('territory') 
} 

然後我有模擬數據(使用HTTP-模擬),看起來像這樣:

// api/users/ 
data: { 
    type: "users", 
    id: 1, 
    attributes: { 
     username: "thisIsMyUsername" 
    } 
}, 
relationships: { 
    territories: { 
     links: { 
      self: "http://localhost:4200/api/users/1/territories" 
     } 
    } 
} 

// api/users/1/territories 
data: { 
    type: "user-territories", 
    id: 1, 
    attributes: { 
     notes: "This is a note", 
     startDate: "2017-01-01" 
    } 
}, 
relationships: { 
    user: { 
     link: { 
      self: "http://localhost:4200/api/users/1" 
     } 
    }, 
    territory: { 
     link: { 
      self: "http://localhost:4200/api/territories/1" 
     } 
    } 
} 

// api/territories/1 
data: { 
    type: "territories", 
    id: 1, 
    attributes: { 
     name: "Territory #1" 
    } 
} 

在我的用戶路由中,我想要請求UserModel並有權訪問UserTerritory關係數據和Territory本身。 API調用是不是我所期望,但:

this.get('store').findRecord('user', 1, { include: "territories" }); 

預期:

  • API /用戶/ 1
  • API /用戶/ 1 /地區

實際:

  • api/users/1
  • API /用戶/ 1包括=土

如果我調用用戶的領土模型我得到這個:

預期:

  • API /用戶/ 1 /地區

實際:

  • api/user-territories/1

回答

1

如果您使用included,那麼ember-data基本上認爲您要告訴服務器側載數據。如果您返回links,只需解決關係。但relationships必須位於data之內。此外,self鏈接是用於關係本身,以返回數據使用related

因此,首先你要做點像user = store.findRecord('user', '1'),這將取到api/users/。然後,你應該返回是這樣的:

// api/users/ 
{ 
    data: { 
    type: "users", 
    id: 1, 
    attributes: { 
     username: "thisIsMyUsername" 
    } 
    relationships: { 
     territories: { 
     links: { 
      related: "http://localhost:4200/api/users/1/territories" 
     } 
     } 
    } 
    } 
} 

接下來你做user.get('territories')。這將返回一個承諾,並獲取http://localhost:4200/api/users/1/territories或任何內部相關鏈接。但是請知道,ember-data預計會在此處返回user-territories,因爲那是您在territories: DS.hasMany('user-territories')中指定的內容。您應該知道您可以直接在ember-data中建立多對多關係,而無需第三個表格。