ember.js - emberfire 有没有办法指定模型上的时间戳属性应该被赋予 Firebase.ServerValue.TIMESTAMP 值?

标签 ember.js ember-data emberfire

我有一个带有时间戳属性的模型。在服务器上创建记录时,我希望此属性的值由服务器而不是客户端提供的值初始化,以便这些时间戳在不同客户端之间保持一致。

如果我直接使用 firebase API,那么我知道我可以使用特殊 token 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);
    }
});

然后你可以按预期使用它:
// models/somemodel.js
import DS from 'ember-data';

export default DS.Model.extend({
    createdAt: DS.attr("timestamp")
});

然后在一些 Controller 或其他东西中:
this.store.createRecord("somemodel", { createdAt: Firebase.ServerValue.TIMESTAMP });

当您保存它时,它会在服务器的副本上使用正确的值设置该字段,但不会使用该值更新本地记录。我仍在研究如何解决这个问题,但是一旦 EmberFire 更新,新的 Ember Data Store.fetch() 方法似乎是最坏的解决方案。

编辑:

又挖了一些。一些注意事项:
  • 当您使用此方法创建记录并对其调用 save() 时,DS.Store 会调用 didCreateRecord 事件处理程序,该处理程序通常会反序列化服务器返回的记录(您通常会在此处获取模型 ID 和其他内容),但在这种情况下,它不会反序列化,因为 FirebaseAdapter 的 create/updateRecord 方法返回不带任何参数( https://github.com/firebase/emberfire/blob/v1.3.1/src/data.js#L492 )调用其解析处理程序的 promise ,因此 Store 方法未定义,而不是序列化记录。在铺平此用例方面,理想情况下,这是我想要定位解决方案的地方。
  • 看起来服务器时间是作为估计生成的,无论如何都是通过在连接服务器 websocket 时设置的时间偏移变量在客户端同步生成的。因此,当您使用 Firebase.ServerValues.TIMESTAMP 值保存/更新记录时,它会占用客户端时间,按偏移量修改它,并使用它创建更新数据。这看起来被修改为服务器上的实际值,并且修改最终将传播到客户端。 -- 如果您真的需要立即获得该值,您可以再次保存您的记录,它将为您提供服务器生成的值。
  • 关于ember.js - emberfire 有没有办法指定模型上的时间戳属性应该被赋予 Firebase.ServerValue.TIMESTAMP 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26315454/

    相关文章:

    javascript - Ember删除记录太多递归

    javascript - 如何从对象键构建标签

    ember.js - 使用 Firebase Simple Login 保护路由

    javascript - emberfire 1.3.2 是否实现了 findQuery 方法?

    javascript - Ember.js - 使用 EmberFire 从 Firebase 中删除数据

    javascript - 无法循环遍历 ember 模板中的 json 响应

    javascript - 在 ember.js 中将参数传递给 init

    javascript - 如何更改 EmberJS 关系的空值

    backbone.js - 将 Parse API (parse.com) 与 ember.js 模型一起使用

    ember.js - 使用 ember 数据 findQuery 的结果作为 ArrayController contentBinding