首页 文章

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

提问于
浏览
0

该应用程序显示特定时间段的工作班次 . 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,则可以正常工作 . 但我需要能够限制数据量,因为加载多年的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 回答

  • 1

    新数据可以很好地融入您的Firebase,您可以通过检查Firebase信息中心或在浏览器的开发控制台中运行这样的快速代码段来查看:

    new Firebase("https://firebaseurl").once('value', function(s) { console.log(s.val()); })
    

    数据甚至会将其恢复到您的应用程序中 . 唯一的问题是Angular不知道新数据已经到达,因此它不会使用新数据更新视图 .

    通常,当新数据从Firebase到达时,AngularFire的 $asObject$asArray 方法会负责通知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

相关问题