2

Ionic アプリでphonegap-estimotebeaconsプラグインを使用して、いくつかのビーコンの範囲を設定しています。ビーコン情報が更新されたら、ビューを更新したいのですが、別のタブに切り替えてから元に戻すまでリストが更新されません。

見つかったすべてのビーコンをリストする私のビューは次のとおりです。

<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変数が変更されたらすぐにビューを更新するにはどうすればよいですか?

アップデート

$scope.beaconsコントローラーのコードを変更して、空の配列に初期化しようとしたことを示しましたが、違いはありません。

4

2 に答える 2

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
  };
})
于 2015-02-12T15:29:58.253 に答える
0

Ionic + Estimote ビーコンを使用してみます。

Ionic フレームワークに「EstimoteBeacons」をどのように挿入しますか? 他のプラグインには ngCordova を使用しましたが、Estimote は含まれていません :-)

同様に BLE プラグイン $ cordova plugin add 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;
      }
    );
  });

})

一番!!

于 2015-06-01T01:58:45.003 に答える