2016-07-21 4 views
0

角型アプリケーションの開始時にコードを一度だけ実行する必要がある状況があります。私のアプリはcordova-pluginsを使ってビーコンを探して、それが見つかった場合は別の状態にリダイレクトされます。それ以外の場合はhome/splashの状態にとどまります。角型アプリケーションの先頭でコードを一度実行する方法

現在、私はこのコードを「ホーム」コントローラで実行していますが、動作していますが、より洗練されたソリューションを望んでいました。私は単純なif/elseステートメントと$scopeの変数を使用して状態の変更を制御しています。助けを事前に

homeCtrl.$inject = ['$scope', '$state', '$rootScope', '$ionicPlatform', '$cordovaBeacon']; 
function homeCtrl($scope, $state, $rootScope, $ionicPlatform, $cordovaBeacon) { 

    $scope.skip = false;   
    $ionicPlatform.ready(function() { 

     $cordovaBeacon.requestWhenInUseAuthorization(); 

     $rootScope.$on("$cordovaBeacon:didRangeBeaconsInRegion", function(event, pluginResult) { 
      if (!$scope.skip) { 
       $scope.skip = true; 
       $state.go('app.beacon'); 
      } 
     });   

     $cordovaBeacon.startRangingBeaconsInRegion($cordovaBeacon.createBeaconRegion("abcdefg", "8484848484848484848")); 
    }); 
} 

ありがとう:

は、ここに私のコントローラです。

+0

@Manuあなたのデモのコントローラが起動するずっと前から、ドキュメントは準備ができていました。角度が起動前にブートストラップされていない – charlietfl

答えて

-1

ngInitはあなたが定義しているWhereeverあなたがあなたのケース

に必要なものは、あなたのappcontrollerあなたがあなたのアプリ一度だけ属性ng-init内の最初に実行する方法を指すことができます。

<!DOCTYPE html> 
 
<html> 
 
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
 
<body> 
 

 
<div ng-app="" ng-init="myText='Hello World!'"> 
 

 
<h1>{{myText}}</h1> 
 

 
<p>The ng-init directive has created an AngularJS variable, which you can use in the application.</p> 
 

 
</div> 
 

 
</body> 
 
</html>
source


しかし、角度のドキュメントは、厳密には、あなたが初期化の目的のためにngInitを使用してはならないと述べています。see docs

このディレクティブは、 、テンプレートにロジックの不要な量を追加するために悪用されることができます。以下のデモ に見られるように、ngRepeatのエイリアシング特殊プロパティと同様に、ngInitの適切な使用方法はごくわずかです( )。サーバー側のスクリプトを使用してデータを注入するためのものです。 少数のケースのほかに、ngInitではなくコントローラを使用して、 の値をスコープで初期化する必要があります。

値の初期化は、コントローラから行う必要があります。 (see docs)

使用コントローラへ:$スコープオブジェクトの初期状態を設定し

。 $ scopeオブジェクトに動作を追加します。

+0

これは 'ng-init'が使われることを意図したものではありません。最初にこれを管理するには、なぜビューが必要でしょうか? – charlietfl

1

利用ラン

app.run(function('$scope', '$state', '$rootScope', '$ionicPlatform', '$cordovaBeacon'){ 
function homeCtrl($scope, $state, $rootScope, $ionicPlatform, $cordovaBeacon) { 

$scope.skip = false;   
$ionicPlatform.ready(function() { 

    $cordovaBeacon.requestWhenInUseAuthorization(); 

    $rootScope.$on("$cordovaBeacon:didRangeBeaconsInRegion", function(event, pluginResult) { 
     if (!$scope.skip) { 
      $scope.skip = true; 
      $state.go('app.beacon'); 
     } 
    });   

    $cordovaBeacon.startRangingBeaconsInRegion($cordovaBeacon.createBeaconRegion("abcdefg", "8484848484848484848")); 
}); 

任意のコントローラがロードされているか、いずれかのサービスが注入される前に実行して、最初に実行されます。

関連する問題