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 中重现)。
我正在使用以下方法从 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 中重现)。