如何在重新联机时阻止AngularFire同步过时数据?

时间:2013-09-11 06:22:46

标签: angularjs firebase angularfire

我正在使用AngularFire来管理协作单页面应用程序和FireBase之间的同步状态。当所有客户端都在线时,这非常有效,但我发现当一个人从睡眠状态返回并重新连接时,它的世界陈旧视图似乎会覆盖其他客户端上更新的数据。

观察

在我的应用中,如果学生将checkInTime属性设置为某个值,则会将其视为已签入,否则将签出。当一个客户端使用下面的示例数据脱机并且另一个仍然活动的客户端检出第三个学生时,当离线客户端重新联机时,学生可能会重新出现(此时所有客户端似乎都存在不稳定的时期) '数据改变了一点,我理解这是FireBase合并过程的一个自然部分。)

实施细则

具体来说,我有这种形式的数据:

{
  "users" : [ null, {
    "center" : {
      "students" : [ {
        "checkOutTime" : "2013-09-10T02:32:15.916Z",
        "last" : "Adams",
        "dob" : "10/09/03",
        "visible" : true,
        "first" : "Bob"
      }, {
        "checkOutTime" : "2013-09-10T16:22:33.591Z",
        "last" : "Adams",
        "dob" : "11/28/08",
        "visible" : true,
        "first" : "George"
      }, {
        "last" : "Smith",
        "dob" : "01/08/03",
        "checkInTime" : "2013-09-11T02:59:35.988Z",
        "visible" : true,
        "first" : "Sam"
      }
   ]
}

此数据通过Angular服务中的$rootScope绑定到angularFire(new Firebase(centerUri + 'students'), $rootScope, "user.students");,以便可以在我的应用中的不同视图之间共享数据。然后将$rootScope.user对象绑定到子范围,以便我的视图模板可以引用students数组。

此外,在我的主视图模板中,我通过调用此$scope.getDuration = function (student) { ... }之类的控制器函数来显示学生已经签入的持续时间。因此,我的主视图还有一个setTimeout循环,每30秒启动一次$scope.$digest(),以确保持续时间字符串是最新的。

我想学习的是,当客户重新上线时,我可以做些什么来帮助确保在合并过程中获得正确,最新的数据,以及我可能做错了什么来混淆FireBase。

谢谢!

1 个答案:

答案 0 :(得分:0)

较新版本的AngularFire使用不同于此问题的同步机制,所以我想说这个问题已经解决了。

用于在AngularFire中同步状态的新基础API与前一个angularFireCollection的工作方式类似,我在学生数组中使用它来规避这个问题。 AngularFire的第一个版本(我上面使用的)是每次更改任何学生的任何值时同步整个学生数组,导致最近唤醒系统更新的陈旧值与其他更新的更新之间的大量延迟和多产冲突迄今为止的数据。每个学生在有效更改时单独更新,可以消除我的应用程序中的不稳定时期,并允许更加优雅的追赶过程,因为过时的系统会重新同步。