EmberJs在保存后不更新记录

问题描述:

当我通过const myRecord = this.store.createRecord('myType', myObject)创建记录然后myRecord.save()时,请求通过适配器发送到服务器。数据成功保存,服务器将所有数据返回给客户端。它通过串行器通过normalize()钩子返回。EmberJs在保存后不更新记录

问题是,当我刷新页面灰烬不更新myRecord对象从服务器返回的属性,例如idversion ......

,所有属性都没有(当然)。

我有更新记录类似的问题。我的应用程序中的每个记录都有一个由服务器检查的版本属性。每次保存时都会增加版本。这是为了数据安全。问题是,当我尝试多次更新记录时,只有第一次尝试成功。原因是在请求从服务器返回后version未更新。 (是的,服务器返回更新的版本)

这对我来说是一个令人惊讶的行为,在我看来就像这里建议的预期功能 - https://github.com/ebryn/ember-model/issues/265。 (但该帖子是从2013年开始的,并且建议解决方案对我来说不起作用)。

任何想法?

对于completenes,这里是有关代码(简化的和重命名)

基于myModel

export default Ember.Model.extend({ 
    typedId: attr('string') // this serves as an ID 
    version: attr('string'), 
    name: attr('string'), 
    markup: attr('number'), 
}); 

myAdapter

RESTAdapter.extend({ 
    createRecord(store, type, snapshot) { 
     // call to serializer 
     const serializedData = this.serialize(snapshot, options); 

     const url = 'http://some_internal_api_url'; 
     // this returns a promise 
     const result = this.ajax(url, 'POST', serializedData); 

     return result; 
    }, 
}); 

mySerializer

JSONSerializer.extend({ 
    idAttribute: 'typedId', 

    serialize(snapshot, options) {  
     var json = this._super(...arguments); 
     // perform some custom operations 
     // on the json 
     return json; 
    }, 

    normalize(typeClass, hash) { 
     hash.data.id = hash.data.typedId; 

     hash.data.markup = hash.data.attribute1; 
     hash.data.version = parseInt(hash.data.version, 10); 

     return hash; 
    } 
}); 

根本原因在串行器的normalize()方法中。 应该打电话给this._super.apply(this, arguments);,然后写入Data Store中的更改。否则,它们不会反映在那里。查看文档http://emberjs.com/api/data/classes/DS.JSONSerializer.html#method_normalize

所以工作代码看起来是这样的

normalize(typeClass, hash) { 
     hash.data.id = hash.data.typedId; 

     hash.data.markup = hash.data.attribute1; 
     hash.data.version = parseInt(hash.data.version, 10); 

     return this._super.apply(this, [typeClass, hash.data]); 
    } 

最有可能你把这个版本

return this._super.apply(this, arguments);