Ember 数据 - 如何反序列化 model.serialize()?

Ember Data - How to deserialize model.serialize()?

在 Ember 数据 3.24 中,如果你这样做

foo = record.serialize()

你怎么能逆转这个过程?即反序列化 foo 中的 JS 对象并更新记录?

Model.serialize()的逆过程是Store.pushPayload():

// push some sample data into Ember Data's store
this.store.push({
  data: {
    type: 'post',
    id: '1',
    attributes: {
      title: 'foo',
    },
  },
});

// get the record    
const record = this.store.peekRecord('post', '1');

// serialize the record
const serialized = record.serialize({ includeId: true });

// manipulate the record to see the update
// this assumes that the application uses the default JSON:API serializer
serialized.data.attributes.title = 'bar';

// push the new state into the store again
this.store.pushPayload('post', serialized);

// verify that the update is reflected in Ember Data's store
console.log(record.title); // "bar"

请注意 Store.pushPayload() 而不是 return 负载中的记录。

如果你想将一条记录推送到商店并获取那条记录,你可以使用Store.push()。但是那个人期望一个规范化的 JSON:API 文档遵循 ​​Ember Data.

的内部约定

有效负载可以按照 Ember 数据的内部约定使用 Serializer.normalizeResponse() 方法规范化为 JSON:API 文档。但是它有一个复杂的参数接口,不适合Ember数据的日常使用。

// manipulate serialized state
serialized.data.attributes.title = 'baz';

// normalize the payload to JSON:API document following Ember Data's conventions
const store = this.store;
const model = this.store.modelFor('post');
const normalized = this.store.serializerFor('post').normalizeResponse(this.store, PostModel, serialized, undefined, 'findRecord');

// push it into the store
const result = this.store.push(normalized);

// verify that store has been updated
console.log(record.title); // "baz"

// Store.push() returns the record
console.log(record === result);

如果只处理一条记录,不需要完全逆向的功能,也可以使用Store.normalize()。假设您的应用程序使用 JSON:API 序列化程序,有效负载也可以像这样规范化:

const normalized = this.store.normalize('post', serialized.data);
this.store.push(normalized);