如何在调用 ember 数据的 destroy Record() 时从 json-api 服务器 200 响应访问顶级元键

How to access top level meta key from json-api server's 200 response when calling ember data's destroyRecord()

我正在开发一个 Ember 应用程序,它使用 Ember 数据和现在默认的 json-api 适配器。

根据 json-api 规范 (http://jsonapi.org/format/#crud-deleting) 删除记录时,如果删除是 return 一个 200 响应成功,服务器仅响应顶级 meta 键。

我当前的服务器就是这样做的,我正在尝试弄清楚如何在使用 Ember 数据的 model.destroyRecord() 方法时访问顶级元对象中的数据。

myModel.destroyRecord().then(function(model){
    // the returned value is the model.  How can I get the actual metadata 
    // returned by the server?   
});

服务器响应包含有关具体删除内容的信息,如下所示:

{
   "meta": {
      num-deleted-a: 10,
      num-deleted-b: 100,
      num-deleted-c: 200
    }
}

我想获取此信息以便将其显示给用户。

谢谢!

我正在使用以下版本:

Ember             : 2.2.0
Ember Data        : 2.3.3
jQuery            : 1.11.3

Ember 目前不支持单个模型请求(findsavedestroyRecord)的 meta

如果你想要这个,你必须连接到 ember 内部。

以下代码使用 ember 来自 ember 2.3 的内部构件,可能会在未来的版本中中断!

store 上有一个未记录的 _metadataFor 函数,它为您提供给定类型的最后一个元数据。我使用自定义初始化程序始终将其保存到 Model:

import Ember from 'ember'; 
import DS from 'ember-data';
const {set} = Ember;
export function initialize(application) {
  DS.Model.reopen({
    meta: null,
    didCommit() {
      this._super(...arguments);
      set(this, 'meta', this.store._metadataFor(this.constructor.modelName));
    }
  });
};

export default {
  name: 'meta',
  initialize: initialize
};

之后你可以做 model.save().then(() => console.log(model.get('meta')))model.destroyRecord.then(() => console.log(model.get('meta'))).

Maybe checkout this ember-twiddle.

升级到 Ember 2.6.1 和 Ember 2.6.1 后,我无法再访问 store._metadataFor 属性。

为了从特定调用访问元数据,我现在重写了模型的序列化程序,并向模型本身添加了一个 meta 属性,它只传递元数据。

例如,我有一个名为 vote 的记录类型,保存后 returns 一些元数据。

对于模型,我执行以下操作:

// Vote Model (/app/models/vote)
export default DS.Model.extend({
  vote: DS.attr('number'),
  // Since i don't provide a transform the values for meta are passed through in
  // raw form
  meta: DS.attr()
});

然后在投票模型的序列化程序中,我执行以下操作:

// Vote serializer (/app/serializers/vote)
import DS from "ember-data";

export default DS.JSONAPISerializer.extend({
  normalizeSaveResponse(store, primaryModelClass, payload, id, requestType) {
    // The metadata in the payload does get processed by default and will be
    // placed into a top level `meta` key on the returned documentHash
    let documentHash = this._super(store, primaryModelClass, payload, id, requestType);

    // Make sure we always have an empty object assigned to the meta attribute
    if(typeof(payload.meta) !== 'object'){
      payload.meta = {};
    }

    // Move the metadata into the attributes hash for the model
    documentHash.data.attributes.meta = payload.meta;

    return documentHash;
  }
});

请注意,在上面的示例中,我只是在对商店进行保存调用时将元数据添加到投票模型中。如果您想始终添加元数据,那么您将覆盖 normalize 方法而不是 normalizeSaveResponse 方法。

然后您可以访问保存调用结果中的 meta 字段。

let vote = self.store.createRecord('vote', {
   vote: voteValue
});

vote.save().then(function(result){
   // this will now contain your metadata
   console.info(result.get('meta'));
});