该应用程序显示特定时间段的工作班次 . firebaseConn.getShifts是获取给定时间段的shiftData的API函数 .
版本:firebase:2.0.6 angularFire:0.9.0(也用0.8.2确认)
这是我的firebase架构:
这是代码:
.factory('watchers', function(bunch-of-dependencies) {
var unbindShifts = function() {};
var inited = false;
var shifts = {};
......中间有一些不相关的代码......
function initShifts() {
unbindShifts();
shifts.object = firebaseConn.getShifts( false, from, to, $scope );
$scope.shifts = shifts.object;
shifts.object.$bindTo($scope, "shifts").then(function(unbind) {
unbindShifts = unbind;
});
}
firebase-queries(在添加unbind / bind和可能基于时间的查询之前工作正常可能会导致问题):
firebaseConn.getShifts = function(asArray, from, to, scope) {
return cacheRequest(FBURL + "shifts", asArray, [from, to]);
};
function cacheRequest(url, asArray, limits) {
var type = asArray ? "array" : "object";
var startAt = limits ? limits[0] : undefined;
var endAt = limits ? limits[1] : undefined;
var retObj, FBRef;
cached[url] = cached[url] || {};
/* If there are limits-parameters we don't cache at all atm. Since those queries should be checked differently than static urls */
if(!limits && cached[url][type]) {
FBRef = cached[url][type];
} else {
FBRef = cached[url][type] = createFBRef(url, startAt, endAt);
}
if(asArray) {
retObj = FBRef.$asArray();
} else {
retObj = FBRef.$asObject();
}
return retObj;
}
function createFBRef(resourceURL, startAt, endAt) {
var modifiedObject = $firebase( createRef( resourceURL ).orderByKey().startAt(startAt).endAt(endAt) );
return modifiedObject;
}
function createRef(resourceURL) {
return new Firebase( resourceURL );
}
现在我找到了问题与查询限制 . 如果未定义from和to Dates,则可以正常工作 . 但我需要能够限制数据量,因为加载多年的workshift数据,显示几周时间,将不会很好:) .
实际问题不是显示和获取数据,一切正常,它与时间和重新绑定有关 .
如果我对例如“20150115” - 表 . 例如,我在那里添加另一个“组” - 孩子 . 当我取消绑定并重新绑定时,整个“20150115”-table被删除,这仅适用于最新的更改 . 如果我将多个孩子添加到不同日期,例如“20150113”,“20150114”,“20150115”和最新的更改在“20150115”然后我解除绑定从firebase再次绑定,所有其他根路径将保持不变,但最新的变化“ 20150115“将删除整棵树 .
我希望自己清楚明白,为了安全起见,我试着以更简单的方式再次解释它 . - 通过应用程序更改为1.“20150113”,2 . “20150114”,3 . “20150115” . - 从UI更改时间线会导致:解除绑定 - 作为副作用,整个“20150114”树将被删除 .
该问题以某种方式与使用orderByKey() . startAt(startAt).endAt(endAt)和绑定的高级查询相关 .
还有其他信息 . 通过UI添加的数据将添加到firebase数据库,但是当重新绑定发生时,数据将从数据库中删除 . 特别是在重新绑定时,如果我使用超时延迟重新绑定,则解除绑定不会导致任何问题 .
EDIT:
我找到了实际问题的根源 . 在新绑定到位并且所有内容都处于有序状态之后,会出现一个角度监视事件 . 该事件会尝试在重新绑定之前保存最后一次更改用户 .
所以,如果我有12月的活动时间表(20141201 - 20141230),我更改“20141225” - 数据 . 然后将时间线更改为20150101 - 20150130,导致解除绑定并重新绑定(或手动获取新数据) . 在绑定完成并且一切似乎都有序之后会有一个事件,试图将20141225数据保存到新的时间轴(20150101 - 20150130)或旧时间线,不确定是哪一个 . 这会导致firebase实际删除整个20141225树,而不是保存数据 .
1 回答
新数据可以很好地融入您的Firebase,您可以通过检查Firebase信息中心或在浏览器的开发控制台中运行这样的快速代码段来查看:
数据甚至会将其恢复到您的应用程序中 . 唯一的问题是Angular不知道新数据已经到达,因此它不会使用新数据更新视图 .
通常,当新数据从Firebase到达时,AngularFire的
$asObject
和$asArray
方法会负责通知AngularJS . 但由于您不断创建新查询,因此您必须自己处理 .有几种方法可以向AngularJS发送新数据,我绝对不是哪一个最好的专家 . 但是如果你将
$scope.$apply();
添加到你的setDays
函数中它可以工作:更新了Plunkr并进行了此更改(以及其他一些有助于调试的内容):http://plnkr.co/edit/YZtkzUNtjQUCcw4xb2mj?p=preview