Я вытаскиваю результирующий набор объектов из 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 удаляет некоторые теги, но просто поместите ng-app = "myApp" в тег html и ng-controller = "MyController" на тег body).
Чтобы воспроизвести проблему, откройте два отдельных экземпляра этого кода. Перейти в автономный режим. В одном случае введите первый штрих-код в текстовое поле и нажмите клавишу ввода. В другом случае введите второй штрих-код и нажмите 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>
Чтобы быть понятным, оба клиента подключаются, и оба, кажется, толкают свои автономные обновления в FB - это я вижу, зайдя в FB. Но только один из клиентов отражает оба набора изменений. Это ошибка? Должен ли я использовать транзакцию()? – quijames
Чрезвычайно непонятно, что вы ожидаете или используете. Если два клиента пишут в одну запись, они будут перезаписаны. Я не уверен, что вы подразумеваете под «отражением обоих наборов изменений». Если вы хотите сохранить запись аудита, вы должны использовать push() для создания новой записи с каждым обновлением, а не переписывать ее. Возможно, вам стоит начать с X-части проблемы [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378) и сэкономить время? – Kato
Список объектов извлекается из FB на 2 разных клиента, все с некоторым свойством (называется someProp), установленным в false. Каждый клиент отображает список на экране. Оба клиента отправляются в автономный режим. Клиент 1 затем обновляет список [0] .someProp = true. Клиент 2 тем временем обновляет список [1] .someProp = true. Затем оба клиента выходят в интернет. Через несколько секунд клиент 1 обновляет и показывает список [0] и список [1], оба имеют someProp == true, но клиент 2 все еще показывает список [0] .someProp == false и список [1] .someProp == true , В FB я вижу оба списка [0] .someProp == true и list [1] .someProp == true. Почему это? – quijames