質問にはすでに述べたように、これはルータのリゾルバで通常解決されます。これはルートコントローラの初期化が自然にこのように延期されるためです。 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番目のオプション(イニシャライザアプリケーション)は適用されません。これは最初のオプション(ルートリゾルバ)で実行する必要があります。
アプリケーションがSPAでない場合は、なぜ角度を使用していますか? Infact、あなたはSPAになるように書き直してみませんか? – Jodrell
私はしばらくそれをやろうと計画していますが、今のところこれを稼働させなければなりません。 – van
ページを変更すると、ブラウザはすべてのもの、つまりブラウザの仕組みを読み込みます。 – Jodrell