2

我正在使用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 服务绑定到我的$rootScopevia angularFire(new Firebase(centerUri + 'students'), $rootScope, "user.students");,以便可以在我的应用程序中的不同视图之间共享数据。然后将该$rootScope.user对象绑定到子作用域中,以便我的视图模板可以引用该students数组。

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

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

谢谢!

4

1 回答 1

0

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

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

于 2014-06-14T04:10:07.230 回答