2015-02-07 5 views
2

Я использую плагин phonegap-estimotebeacons в своем приложении Ionic, чтобы установить некоторые маяки. Когда он получает обновленную информацию о маяке, я хочу, чтобы она обновляла представление, но мой список не обновляется до тех пор, пока я не перейду на другую вкладку и не вернусь обратно.Обновить Ионный вид из асинхронного обратного вызова

Вот мой взгляд, в котором перечислены все найденные маяки:

<ion-view view-title="Beacons"> 
    <ion-content> 
    <ion-list> 
     <ion-item ng-repeat="beacon in beacons" type="item-text-wrap"> 
     <span>{{beacon.macAddress}}</span> 
     <span>{{beacon.distance}}</span> 
     </ion-item> 
    </ion-list> 
    </ion-content> 
</ion-view> 

Вот контроллер, который делает вид:

.controller('BeaconsCtrl', function($scope, Beacons) { 
    $scope.beacons = []; 
    Beacons.range($scope); 
}) 

Beacons завод затем начинает колебаться маяки и обновить область на каждый успешный обратный вызов:

.factory('Beacons', function() { 
    rangeBeacons = function($scope) { 
    var success = function(beaconInfo) { 
     $scope.beacons = beaconInfo.beacons; 
    }; 

    var failure = function(errorMessage) { 
     alert(errorMessage); 
    }; 

    EstimoteBeacons.startRangingBeaconsInRegion(
     {}, 
     success, 
     failure 
    ); 
    }; 

    return { 
    range: rangeBeacons 
    }; 
}) 

Из другого примера Я видел, похоже, мое мнение должно реагировать, когда я обновляю объект $scope, но мне нужно перейти на другую вкладку, а затем вернуться, чтобы обновить мой просмотр. Что я могу сделать, чтобы обновить представление, как только будет изменена переменная $scope?

Update

Модифицированный код контроллера, чтобы показать, что я пытался инициализировать $scope.beacons пустой массив, но это не имеет никакого значения.

ответ

9

Я нашел решение. Поскольку обратный вызов происходит за пределами цикла дайджеста, нам нужно позвонить $scope.$apply(). Инициализация маяков для пустого массива не требуется.

Обновленный код контроллера:

.controller('BeaconsCtrl', function($scope, Beacons) { 
    Beacons.range($scope); 
}) 

Обновленный сервисный код:

.factory('Beacons', function() { 
    rangeBeacons = function($scope) { 
    var success = function(beaconInfo) { 
     $scope.beacons = beaconInfo.beacons; 
     $scope.$apply(); 
    }; 

    var failure = function(errorMessage) { 
     alert(errorMessage); 
    }; 

    EstimoteBeacons.startRangingBeaconsInRegion(
     {}, 
     success, 
     failure 
    ); 
    }; 

    return { 
    range: rangeBeacons 
    }; 
}) 
0

я буду стараться использовать Ионные + Estimote маяки.

Как вы добавляете «EstimoteBeacons» в Ionic Framework? Для других плагинов, которые я использовал ngCordova, но Estimote не в этом :-)

Как BLE плагин $ Cordova плагин добавить com.megster.cordova.ble

Вы можете закодировать так:

.controller('DashCtrl', function($scope, $cordovaBLE) { 

    $ionicPlatform.ready(function() { 
    $cordovaBLE.isEnabled().then(
     function() { 
      $scope.bluetoothStatus = "Bluetooth LE is enabled"; 
      $scope.settings.enableBLE = true; 
     }, 
     function() { 
      $scope.bluetoothStatus = "Bluetooth LE is NOT enabled"; 
      $scope.settings.enableBLE = false; 
     } 
    ); 
    }); 

}) 

лучший !!

+0

https://github.com/evothings/phonegap-estimotebeacons/blob/master/examples/beacon-finder/README.md – Samo

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