sol*_*erg 4 ember.js ember-data emberfire
我有一个带有timestamp属性的模型.当在服务器上创建记录时,我希望服务器而不是提供值的客户端使用值初始化此属性的值,以便这些时间戳在不同客户端之间保持一致.
如果我直接使用firebase API,那么我理解我可以使用特殊令牌Firebase.ServerValue.TIMESTAMP来实现这一点.但我无法弄清楚如何使用ember-data和emberfire适配器来做到这一点.
对不起,我知道这已经很晚了,但我遇到了同样的问题.
您可以使用直接传递该值的DS.Transform定义自定义属性类型,就像序列化它一样.我只是命名我的时间戳.
// transforms/timestamp.js
/* global Firebase */
import DS from 'ember-data';
export default DS.DateTransform.extend({
serialize: function(date) {
if(date === Firebase.ServerValue.TIMESTAMP){
return date;
}
return this._super(date);
}
});
Run Code Online (Sandbox Code Playgroud)
然后你可以按预期使用它:
// models/somemodel.js
import DS from 'ember-data';
export default DS.Model.extend({
createdAt: DS.attr("timestamp")
});
Run Code Online (Sandbox Code Playgroud)
然后在某些控制器或其他东西:
this.store.createRecord("somemodel", { createdAt: Firebase.ServerValue.TIMESTAMP });
Run Code Online (Sandbox Code Playgroud)
保存时,它会在服务器副本上设置具有正确值的字段,但不会使用该值更新本地记录.我还在研究如何解决这个问题,但是新的Ember Data Store.fetch()方法似乎是EmberFire最新的最坏情况解决方案.
编辑:
做了一些挖掘.一些说明:
使用此方法创建记录并在其上调用save()时,DS.Store会调用didCreateRecord事件处理程序,该处理程序通常会反序列化服务器返回的记录(通常是您获取模型ID和内容的位置),但在这种情况下,它没有反序列化,因为FirebaseAdapter的create/updateRecord方法返回无需任何参数调用其解析处理程序的promise(https://github.com/firebase/emberfire/blob/v1.3.1/src/data.js#L492),所以Store方法是未定义的,而不是序列化的记录.就铺设这个用例而言,理想情况下,这是我想要解决方案的地方.
看起来服务器时间是作为估计生成的,无论如何通过在连接服务器websocket时设置的时间偏移变量在客户端上同步生成.因此,当您使用Firebase.ServerValues.TIMESTAMP值保存/更新记录时,它将花费客户端时间,通过偏移修改它,并使用它创建更新数据.这看起来被修改为服务器上的实际值,并且修改最终将传播到客户端. - 如果您确实需要立即使用该值,则可以再次保存记录,它将为您提供服务器生成的值.
| 归档时间: |
|
| 查看次数: |
807 次 |
| 最近记录: |