8
Ember      : 1.13.3
Ember Data : 1.13.5
jQuery     : 1.11.3

EmberJS クライアントからサーバーに ember-data を使用して JSON ペイロードを送信しようとしています。複数のリクエストを送信したくないので、プロジェクトの保存時にオブジェクト グラフ全体をサーバーに送信したいと考えています。複数のリクエストを送っても構わないのですが、途中でひとつのリクエストが失敗し、サーバー上のデータが正しくない場合はどうなるか心配です。

JSONAPI ( http://jsonapi.org/format/#document-compound-documents ) が Ember のデフォルトのアダプターになりつつあるため、使用したいと思いました。また、この形式を扱う C# ライブラリがいくつかあるので、非常に簡単だと思いました。しかし、仕様を読んだ後、ID がないとオブジェクトを埋め込むことができないようです。DS.attr で指定したにもかかわらず、EmberJS も子オブジェクトを JSON にアタッチしません{ async: false, embedded: 'always' })

私の質問は、オブジェクト グラフがクライアント側で作成されるような方法でアプリケーションが使用されている場合、JSONAPI 形式を使用してオブジェクト グラフ全体をサーバーに送信するにはどうすればよいですか? JSONAPI 標準を満たすために、クライアント側で ID を生成する必要がありますか? 次に、サーバーに到達したら無視するだけで、ORMによって生成されたIDで保存されますか?

ここに私の labelGroup モデルがあります:

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  labels: DS.hasMany('label-model', { async: false, embedded: 'always' })
});

ここに私のプロジェクトモデルがあります:

import DS from 'ember-data';

export default DS.Model.extend(DS.EmbeddedRecordsMixin, {
  name: DS.attr('string'),
  labelGroups: DS.hasMany('labelGroup', { async: false, embedded: 'always'})

});

プロジェクトで save() を実行した後に取得する POST は次のとおりです。

{
  "data":{
    "attributes":{"name":"Project"},
    "relationships":{
      "label-groups":{
        "data":[
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null}
       ]
     }
   },
   "type":"label-projects"
  }
}

更新: https://www.npmjs.com/package/ember-cli-uuidを使用して、クライアント側の ID を生成しようとしました。ただし、出力を取得するデータには追加のオブジェクトは含まれず、それらの ID への参照のみが含まれます。http://jsonapi.org/format/#document-compound-documentsで指定されているように、「含まれる」プロパティが表示されることを期待していましたが、そこにはありません。

{
  "data":{
    "id":"7b4544ee-91cd-493d-8b10-52040e68c283",
    "attributes":{"name":"Project"},
  "relationships":{
    "label-groups":{
      "data":[
       {"type":"label-groups","id":"08115273-e82a-4d46-93ea-232ce071fb78"},
       {"type":"label-groups","id":"9ca94fe9-8077-411e-98d2-1694c6fecce4"},
       {"type":"label-groups","id":"d629f1e8-7962-404d-8034-38229ab21f77"},
       {"type":"label-groups","id":"c6bda655-5489-4760-847b-bf02239bb2c5"},
       {"type":"label-groups","id":"f6fef249-2d1d-43f0-ba64-24b7ff8b5637"},
       {"type":"label-groups","id":"a7db25bf-52c8-477b-83e4-64e7c76b072e"},
       {"type":"label-groups","id":"f3b5fbb3-261a-4b3d-b481-b9352f8ce2d6"}
      ]
    }
  },
  "type":"label-projects"
  }
}
4

1 に答える 1

3

Ember-data は、現時点であなたが望むものをサポートしていません。そのため、ember-data は関係データを保存ペイロードに保存しません。

ただし、カスタム アダプターとシリアライザーを使用することで、これを独自に行うことができます。APIをチェックアウトしてから、ソースを調べることを強くお勧めします。

.save()モデルを呼び出すcreateRecordと、アダプターでメソッドが呼び出されます。ここserializeIntoHashでは、モデルをシリアル化するためにシリアライザーが呼び出されます。

serializeIntoHashserializeが呼び出されます。serializeBelongsToserializeHasMany

これで、行の前をオーバーライドserializeHasManyして変更できます。hasMany

json[payloadKey] = hasMany;

ここには、ember-data によって送信されたタイプと ID があります。hasMany のデータだけ.forEachを取得し、データのストアを取得してincluded配列を構築することができます。

これがシリアライザーとアダプターを理解するのに役立つことを願っています。実際、これが ember-data の最も優れた点です。簡単に変更できるアダプターとシリアライザーの構造。

于 2016-01-26T14:55:17.040 に答える