2016-08-19 58 views
0

我的Ember.js應用程序出現問題。它使用JSONAPI{Adapter,Serializer}及以下型號:Ember.js findRecord()使用ID爲null調用替代主鍵的模型

models/node.js

App.Node = DS.Model.extend(
{ 
    // (node 'name' field used as primary key for serialization) 

    info: DS.attr('string'), 
    children: DS.hasMany('node', { inverse: null }) 
} 

代表命名節點的樹。

的JSONAPIAdapter(adapters/application.js)實現的功能的queryRecord()query()findRecord()findAll()翻譯來自服務器的Ember.js查詢。這一切工作正常。

JSONAPISerializer實現函數normalizeResponse()將服務器響應JSON數據轉換爲json:api格式。在串行器,主鍵被定義爲節點的「名稱」字段:

serializers/application.js

App.ApplicationSerializer = DS.JSONAPISerializer.extend(
{ 
    primaryKey: 'name', 

    normalizeResponse(store, primaryModelClass, payload, id, requestType) 
    { 
    // ... 
    } 
}); 

的JSON的樣品:通過串行生成的API的數據是:

{ 
    "data": [ 
    { 
     "type": "node", 
     "attributes": { 
     "info": "Root node" 
     }, 
     "relationships": { 
     "children": { 
      "data": [ 
      { 
       "type": "node", 
       "name": "Root/SubNode1" 
      } 
      ] 
     } 
     }, 
     "name": "Root" 
    } 
    ], 
    "included": [ 
    { 
     "type": "node", 
     "attributes": { 
     "info": "Subnode 1" 
     }, 
     "relationships": { 
     "children": { 
      "data": [ 
      ] 
     } 
     }, 
     "name": "Root/SubNode1" 
    } 
    ] 
} 

我使用Ember.js版本2.7.0和Ember檢查器。

一旦應用程序正在運行並且數據被加載到模型中,我可以看到Ember檢查器中的數據在模型中可見。但是,當調查'數據'視圖中的模型數據(並選擇一個項目)時,我發現Ember調用adapter:findRecord()id = null,導致錯誤的查詢。不知何故,模型數據似乎不正確。

當我刪除JSONAPISerializer中的主鍵定義並將id字段中的節點的name字段複製爲Ember默認主鍵時,一切正常。我的主鍵定義缺少什麼? Ember指南僅說明關於串行器中的primaryKey的信息(https://guides.emberjs.com/v2.7.0/models/customizing-serializers/#toc_ids)。

非常感謝提前!

+0

你有沒有找到一個很好的解決方案呢?我碰到類似的東西 –

回答

0

您需要定義name字段纔能有空間來保存該ID。

App.Node = DS.Model.extend(
{ 
    // (node 'name' field used as primary key for serialization) 
    name: DS.attr('string'), 
    info: DS.attr('string'), 
    children: DS.hasMany('node', { inverse: null }) 
} 
+0

嗨Ebrahim,謝謝你的迴應!我之前嘗試過,但這個成員的名字將保持未定義。我猜Ember認爲它更像是一個屬性成員(而不是頂級成員)。 – KvR

相關問題