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

AngularFire sync not working correctly using $save

我正在使用以下方法从 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(所以去掉了一些标签,但只需将 ng-app="myApp" 放在 html 标签上,而 ng-controller="MyController" 在正文标签上)。

要重现该问题,请打开此代码的两个单独实例。下线。在一个实例中,在文本框中输入第一个条形码并按回车键。在另一种情况下,输入第二个条形码并按回车键。然后上网。两个实例都不会显示第一个和第二个条形码,因为它们都已签入。

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

看来这是一个已在最新版本中更正的错误(我可以在 2.0.4 中重现此问题,但不能在 2.1.1 中重现)。