2016-02-19 48 views
4

我正在使用Ember数据和现在默认的json-api适配器的Ember应用程序。如何从json-api服务器的200响应中调用ember数据的destroyRecord()

按照JSON-API SPEC(http://jsonapi.org/format/#crud-deleting)删除记录时,您的服务器应该返回200响应,如果删除成功,服务器只是一个顶级meta键响应。

我当前的服务器做到这一点,我试图找出如何使用Ember Data的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 

回答

1

灰烬不支持meta对于目前单一的模式请求(findsavedestroyRecord)!

如果你想要这个,你必须钩入烬内部。

以下代码使用来自于ember 2.3的ember内部函数,并可能在未来版本中崩溃!

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.

+0

感谢和抱歉的回复迟!在跟踪代码时我偶然发现了'_metadataFor'属性,并能够使用它。我喜欢你将它直接添加到模型中。 – Sarus

+0

只是FYI的人来到这个使用Ember 2.6。这不再显示工作。 – Sarus

4

升级到2.6.1灰烬灰烬和2.6.1后,我不再能够访问store._metadataFor属性。

要访问特定调用中的元数据,我现在覆盖模型的序列化程序,并将meta属性添加到模型本身,该模型本身只是通过元数据。

作为一个例子,我有一个名为vote的记录类型,保存时会返回一些元数据。

因为我做了以下的模式:

// 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')); 
}); 
+0

normalizeResponse(store,primaryModelClass,payload,id,requestType)payload.data.attributes.meta = payload.meta || {}; 返回this._super.apply(this,arguments); } //请参阅:https://guides.emberjs.com/v2.1.0/models/customizing-serializers/#toc_customizing-srializers – GK100