angularFire startAt查询和绑定删除新数据

时间:2015-01-09 11:32:02

标签: firebase angularfire

该应用程序显示特定时间段的工作班次。 firebaseConn.getShifts是获取给定时间段的shiftData的API函数。

版本: firebase:2.0.6 angularFire:0.9.0(也以0.8.2确认)

这是我的firebase架构:

enter image description here

这是代码:

.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树,而不是保存数据。

1 个答案:

答案 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