2016-08-19 2 views
0

Ember.jsアプリケーションに問題があります。それはJSONAPI{Adapter,Serializer}と、次のモデルを使用していますという名前のノードのツリーを表しEmber.js代替プライマリキーを持つモデルにidを付けてfindRecord()を呼び出す

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)は、サーバからEmber.jsクエリーを翻訳する機能queryRecord()query()findRecord()findAll()を実現します。これはすべて正常に動作します。

JSONAPISerializerは、サーバーの応答JSONデータをjson:api形式に変換するための関数normalizeResponse()を実装しています。シリアライザでは、プライマリ・キーは、ノードの「名前」フィールドになるように定義される:

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がid = nulladapter:findRecord()を呼び出しているため、誤ったクエリが発生することがわかりました。どういうわけか、モデルデータが間違っているようです。

JSONAPISerializerでプライマリキー定義を削除し、nameノードのフィールドをidフィールドにEmberのデフォルトプライマリキーとして複製すると、すべて正常です。私の主キー定義で何が欠けていますか? Emberガイドには、シリアライザのprimaryKeyに関する情報のみが記載されています(https://guides.emberjs.com/v2.7.0/models/customizing-serializers/#toc_ids)。

事前に感謝します。

+0

あなたはこれまでに良い解決策を見つけましたか?私は何かに似て実行している –

答えて

0

idを保存する場所を指定するには、nameフィールドを定義する必要があります。

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

こんにちはエブラヒム、応答のために感謝!これを前に試しましたが、このメンバー '名前'は未定義のままです。 Emberはそれを属性メンバーのように見ていると思います(トップレベルのメンバーとは対照的です)。 – KvR

関連する問題