2017-11-20 7 views
2

メッセージとアプリケーションのバージョンを最初にロードしてローカルストレージに保存してから、後でコントローラで使用するAngularJsアプリケーションがあります。私は今のところ持っていることは(今のところ3です)コントローラのそれぞれにサービスコールである:私は一度だけアプリケーションのバージョンを取得し、そこに保存したいコントローラを呼び出す前にAngularJsアプリケーションを初期化する

localisationService.getMessages($scope.language).then(
      function (data) { 
       $scope.messages = data; 
       //initialze kendo grids with the messages etc. 
       //all of the controller logic is here 
} 

。毎回バージョンを確認する必要はありません(新しいメッセージが新しいバージョンに追加された場合)?

$routeProviderを使用するよう提案されましたが、私のアプリケーションはSPAではありません。だから私は他のアイデアや提案が必要です。あなたの助けに感謝します。

+1

アプリケーションがSPAでない場合は、なぜ角度を使用していますか? Infact、あなたはSPAになるように書き直してみませんか? – Jodrell

+0

私はしばらくそれをやろうと計画していますが、今のところこれを稼働させなければなりません。 – van

+0

ページを変更すると、ブラウザはすべてのもの、つまりブラウザの仕組みを読み込みます。 – Jodrell

答えて

2

質問にはすでに述べたように、これはルータのリゾルバで通常解決されます。これはルートコントローラの初期化が自然にこのように延期されるためです。 AngularJSルータがhashbang mode by defaultを使用しているので、それは非SPAで使用することができます(と複雑な非SPAウィジェットを推奨することができます):

resolve: { 
    l10n: (localisationService) => { 
    return localisationService.getMessages(localisationService.language) 
    } 
} 

結果は、必要に応じてlanguageが変更されていないときの要求を避けるためにキャッシュすることができます。

さらに、すべてのルートに共通のローカル依存関係(l10n)を自動的に追加するためにはroute definitions can be processedです。

非同期に初期化する必要のあるグローバルサービスの問題は、非同期ブートストラップとAPP_INITIALIZERプロバイダを使用して、Angular 2以上で解決することもできます。 AngularJSにはこの機能がありません。 this answerとしてそこに初期化アプリケーションをロード必要なすべてのデータを2つのアプリケーションであり、その後、メインアプリケーションをブートストラップする必要がありAngularJSでこれを実現するために、説明:

angular.module('app', [/* ... */]); 

angular.module('appInitializer', []) 
.factory('loader', ($http) => { 
    return $http.get('...').then((result) => result.data); 
}) 
.factory('initializer', (loader, $document) => { 
    return loader.then((data) => { 
    angular.module('app').constant('l10n', data); 

    $document.ready(() => { 
     angular.bootstrap($document.find('body'), ['app']); 
    }); 
    }); 
}); 

angular.injector(['ng', 'appInitializer']) 
.get('initializer') 
.catch((err) => console.error(err)); 

元のコードに言語が$scope.languageで動的に定義されていることを考慮すると、 2番目のオプション(イニシャライザアプリケーション)は適用されません。これは最初のオプション(ルートリゾルバ)で実行する必要があります。

関連する問題