该应用程序显示特定时间段的工作班次。 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,则可以正常工作。但我需要能够限制数据量,因为加载多年的工作时间数据,显示几周时间,不会很好:)。
实际问题是没有显示和获取数据,一切正常,它与时间和重新绑定有关。
如果我对例如“20150115” - 表。例如,我在那里添加另一个“组” - 孩子。当我取消绑定并重新绑定时,整个“20150115”-table被删除,这仅适用于最新的更改。如果我将多个孩子添加到不同日期,例如“20150113”,“20150114”,“20150115”和最新的更改在“20150115”然后我解除绑定+重新绑定另一次来自firebase,所有其他根路径将保持原样,但最新的更改“20150115”将删除整个树。
我希望自己清楚明白,为了安全起见,我试着以更简单的方式再次解释它。 - 通过应用程序更改为1.“20150113”,2。“20150114”,3。“20150115”。 - 从UI更改时间线会导致:取消绑定+重新绑定 - 作为副作用,整个“20150114”树被删除。
问题与使用orderByKey()。startAt(startAt).endAt(endAt)和绑定的高级查询有某种关系。
另外还有其他信息。通过UI添加的数据将添加到firebase数据库,但是当重新绑定发生时,数据将从数据库中删除。特别是在重新绑定时,如果我延迟重新绑定,则取消绑定不会导致任何问题。
修改
我找到了实际问题的根源。在新绑定到位并且所有内容都按顺序排列后,会出现一个角度监视事件。该事件会尝试保存重新绑定之前的最后一次更改用户。
所以,如果我有12月(20141201 - 20141230)的活动时间表,我更改“20141225” - 数据。然后将时间线更改为20150101 - 20150130,导致解除绑定并重新绑定(或手动获取新数据)。在绑定完成并且一切似乎都有序之后会有一个事件,试图将20141225数据保存到新的时间轴(20150101 - 20150130)或旧时间线,不确定是哪一个。这会导致firebase实际删除整个20141225树,而不是保存数据。
答案 0 :(得分:1)
新数据可以很好地融入您的Firebase,您可以通过检查Firebase信息中心或在浏览器的开发控制台中运行这样的快速代码段来查看:
new Firebase("https://firebaseurl").once('value', function(s) { console.log(s.val()); })
数据甚至会重新进入您的应用程序。唯一的问题是Angular不知道新数据已经到达,因此它不会使用新数据更新视图。
通常,AngularFire的$asObject
和$asArray
方法会在新数据从Firebase到达时通知AngularJS。但由于您不断创建新查询,因此您必须自己处理。
有几种方法可以向AngularJS发送新数据,我绝对不是哪一个最好的专家。但是,如果您将$scope.$apply();
添加到setDays
函数中,则可以正常运行:
function setDays(ref) {
var FBRange = setFBRange(ref, from, to);
var days;
unbindDays();
days = $firebase(FBRange).$asObject();
$scope.days = days;
days.$bindTo($scope, "days").then(function(unbind) {
unbindDays = unbind;
// As a result of the new binding entry gets mysteriously deleted from firebase
});
$scope.$apply(); // Tell AngularJS about the new data, so that it updates the view
function setFBRange(ref, from, to) {
return ref.orderByKey().startAt(""+from).endAt(from + to + "");
}
}
通过此更改更新了Plunkr(以及其他一些有助于调试的内容):http://plnkr.co/edit/YZtkzUNtjQUCcw4xb2mj?p=preview