使用$ save,AngularFire同步无法正常工作

时间:2015-01-19 17:47:49

标签: firebase angularfire

我正在使用Firebase从中提取对象的结果集 $scope.list = $firebase(ref).$asArray()

然后我在列表中找到一个对象并按照以下方式更新它:

var foundObject = $filter('getByFoo')($scope.list, 'bar');
var item = $scope.list.$getRecord(foundObject.$id);
item.foo = "baz";
$scope.list.$save(item).then(function() {});

这样可以正常工作并将更改传播到FB。

我的问题是,如果两个客户端脱机,并且每个客户端更新列表中的不同对象,然后它们同时重新连接,则只有其中一个客户端的更改传播到另一个,反之则不然

有谁知道为什么或者我在这里做错了什么?

编辑 - 下面是重现问题的mcve(SO剥离了一些标签,但只是将h-tag上的ng-app =“myApp”和body标签上的ng-controller =“MyController”)。

要重现此问题,请打开此代码的两个单独实例。下线。在一个实例中,在文本框中输入第一个条形码,然后按Enter键。在另一个例子中,输入第二个条形码并按Enter键。然后上网。两个实例都不会在签入时显示第一个和第二个条形码。

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.17/angular.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.4.7/angular-filter.js"></script>
<script src="https://cdn.firebase.com/js/client/2.0.4/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/0.8.0/angularfire.min.js"></script>

  <input ng-model='barcode' ng-keydown="checkGuest($event)" type='text' id='txtBarcode'  placeholder='Enter barcode'>

  <ul id='ulGuests'>
    <li ng-repeat='guest in guests'>
      <strong>{{guest.Barcode}}</strong>
      {{guest.CheckedIn}}
    </li>
  </ul>

<script>
  var myApp = angular.module("myApp", ["firebase", 'angular.filter']);

  myApp.filter('getByBarcode', function() {
      return function(input, barcode) {
        var i=0, len=input.length;
        for (; i<len; i++) {
          if (+input[i].Barcode == +barcode) {
            return input[i];
          }
        }
        return null;
      }
    });

  myApp.controller('MyController', ['$scope', '$filter', '$firebase',
    function($scope, $filter, $firebase) {

      var ref = new Firebase("https://glowing-heat-7035.firebaseio.com/results/");

      $scope.guests = $firebase(ref).$asArray();

      $scope.checkGuest = function(e) {

        //LISTEN FOR RETURN KEY
        if (e.keyCode === 13 && $scope.barcode) {

            var foundGuest = $filter('getByBarcode')($scope.guests, $scope.barcode);

            var item = $scope.guests.$getRecord(foundGuest.$id);
            if (item.CheckedIn == 'Yes') {
                item.CheckedIn = 'No';
            } else {
                item.CheckedIn = 'Yes';
            }

            $scope.guests.$save(item).then(function() {

            });
        }
      }
    }
  ]);
</script>

1 个答案:

答案 0 :(得分:1)

看起来这是一个在最新版本中得到纠正的错误(我可以在2.0.4中重新编写,但不能在2.1.1中重复)。