我正在使用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
via angularFire(new Firebase(centerUri + 'students'), $rootScope, "user.students");
,以便可以在我的应用程序中的不同视图之间共享数据。然后将该$rootScope.user
对象绑定到子作用域中,以便我的视图模板可以引用该students
数组。
此外,在我的主视图模板中,我通过调用这样的控制器函数来显示学生签到的持续时间$scope.getDuration = function (student) { ... }
。因此,我的主要视图还有一个 setTimeout 循环,它$scope.$digest()
每 30 秒启动一次,以确保持续时间字符串是最新的。
我想了解的是,当客户端重新联机时,我可以做些什么来帮助确保在合并过程中获得正确的最新数据,以及我可能做错了什么来混淆 FireBase。
谢谢!