如何在调用 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 目前不支持单个模型请求(find
、save
和 destroyRecord
)的 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')))
.
升级到 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'));
});
我正在开发一个 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 目前不支持单个模型请求(find
、save
和 destroyRecord
)的 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')))
.
升级到 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'));
});