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 = null
とadapter:findRecord()
を呼び出しているため、誤ったクエリが発生することがわかりました。どういうわけか、モデルデータが間違っているようです。
JSONAPISerializerでプライマリキー定義を削除し、name
ノードのフィールドをid
フィールドにEmberのデフォルトプライマリキーとして複製すると、すべて正常です。私の主キー定義で何が欠けていますか? Emberガイドには、シリアライザのprimaryKey
に関する情報のみが記載されています(https://guides.emberjs.com/v2.7.0/models/customizing-serializers/#toc_ids)。
事前に感謝します。
あなたはこれまでに良い解決策を見つけましたか?私は何かに似て実行している –