2015-01-19 4 views
0

Я вытаскиваю результирующий набор объектов из 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> 

+0

Чтобы быть понятным, оба клиента подключаются, и оба, кажется, толкают свои автономные обновления в FB - это я вижу, зайдя в FB. Но только один из клиентов отражает оба набора изменений. Это ошибка? Должен ли я использовать транзакцию()? – quijames

+0

Чрезвычайно непонятно, что вы ожидаете или используете. Если два клиента пишут в одну запись, они будут перезаписаны. Я не уверен, что вы подразумеваете под «отражением обоих наборов изменений». Если вы хотите сохранить запись аудита, вы должны использовать push() для создания новой записи с каждым обновлением, а не переписывать ее. Возможно, вам стоит начать с X-части проблемы [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378) и сэкономить время? – Kato

+0

Список объектов извлекается из 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

ответ

1

Похоже, что это ошибка, которая была исправлена ​​в последней версии (я мог бы воспроизвести это в 2.0.4, но не в 2.1.1).

Смежные вопросы