【发布时间】:2015-01-09 11:32:01
【问题描述】:
应用程序显示特定时间段的轮班。 firebaseConn.getShifts 是获取给定时间段内 shiftData 的 API 函数。
版本: 火力基地: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 查询(在添加取消绑定/绑定之前运行良好,并且可能基于时间的查询也可能会导致问题):
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 日期,则可以正常工作。但我需要能够限制数据量,因为加载多年的轮班数据,以显示一周的时间,不会很好:)。
实际问题是不显示和获取数据,一切正常,它与时间和重新绑定有关。
如果我对例如“20150115”-表。例如,我在那里添加了另一个“组”-child。当我取消绑定并重新绑定时,整个“20150115”表被删除,这仅适用于最新的更改。如果我将多个孩子添加到不同的日期,例如“20150113”、“20150114”、“20150115”和最新的变化是“20150115”然后我从firebase解绑+重新绑定一次,所有其他根路径将保持原样,但最新的变化是"20150115" 会删除整棵树。
我希望我说清楚,所以为了安全起见,我尝试以更简单的方式再次解释它。 - 通过应用程序更改为 1.“20150113”、2.“20150114”、3.“20150115”。 - 从 UI 更改时间线原因:取消绑定 + 重新绑定 - 作为副作用,整个“20150114”树被删除。
这个问题在某种程度上与使用 orderByKey().startAt(startAt).endAt(endAt) 和绑定的高级查询有关。
也可获取更多信息。通过 UI 添加的数据被添加到 firebase 数据库,但是当重新绑定发生时,数据会从数据库中删除。特别是在重新绑定时,如果我通过超时延迟重新绑定,解除绑定不会导致任何问题。
编辑:
我找到了实际问题的根源。在新的绑定到位并且一切似乎都井井有条之后,就会启动一个 angular watch 事件。该事件会尝试保存用户在重新绑定之前所做的最后一次更改。
因此,如果我有 12 月 (20141201 - 20141230) 的活动时间表并且我更改“20141225”-data。然后将时间线更改为 20150101 - 20150130,导致 unbind 和 rebind(或手动获取新数据)。在绑定完成并且一切似乎都井井有条之后,将发生一个事件,尝试将 20141225 数据保存到新时间线(20150101 - 20150130)或旧时间线,不确定是哪一个。这会导致 Firebase 实际删除整个 20141225 树,而不是保存数据。
【问题讨论】:
-
嘿哈奇。听起来您正在开发一个很酷的应用程序,并且数据结构对于您描述的用例来说看起来很合理。但是我发现很难通过所有文本来理解您的问题。你能写一段最少的代码来重现你的问题吗? (stackoverflow.com/help/mcve)
-
@FrankvanPuffelen 嘿,弗兰克,当然。抱歉,如果我缺乏良好的解释技巧。这是我设法生成的一个 plunkr:plnkr.co/edit/Nk62dYfdiFvqkb9fT06F?p=preview。所以推“addNew”,看到添加的新条目,推“前进”,然后“后退”,由于某种原因,该条目已从 Firebase 中删除。
-
当我采取这些步骤时,新数据仍保留在 Firebase 中。您可以通过
new Firebase("https://your.firebaseio.com").once('value', function(s) { console.log(JSON.stringify(s.val())); })轻松测试。但是您的setDays中缺少$scope.$apply()。我会写一个快速的答案和一些相关问题的指针。
标签: firebase angularfire