Angular 2がモデルをロード/解決するのを待ってから、ビュー/テンプレートをレンダリングする。
質問
Angular 1.xでは、UI-Routerはこのための私の主要なツールでした。resolve"値に対してプロミスを返すことで、ルーターはディレクティブをレンダリングする前に、単にプロミスが完了するのを待ちました。
代わりに、Angular 1.xでは、NULLオブジェクトはテンプレートをクラッシュさせないので、一時的に不完全なレンダリングを気にしないのであれば、単に
$digest
の後にレンダリングするために
promise.then()
が最初に空のモデルオブジェクトを生成した後にレンダリングされます。
2つのアプローチのうち、可能であれば、ビューをロードするのを待ち、リソースをロードできない場合はルートナビゲーションをキャンセルすることを好みます。これにより、ナビゲーションを解除する作業を省くことができます。 EDIT: これは特に、この質問がAngular 2の未来と互換性のある、またはこれを行うためのベストプラクティスの方法を要求し、可能であれば"Elvis operator"を避けるよう求めていることに注意してください! したがって、私はその答えを選択しませんでした。
しかし、これら2つの方法のどちらも、Angular 2.0では動作しません。確かに、これには標準的なソリューションが計画されているか、利用可能です。それが何であるか、誰か知っていますか?
@Component() {
template: '{{cats.captchans.funniest}}'
}
export class CatsComponent {
public cats: CatsModel;
ngOnInit () {
this._http.get('/api/v1/cats').subscribe(response => cats = response.json());
}
}
次の質問は、同じ問題を反映しているかもしれません。 データを持つPROMISEがロードされた後、Angular 2レンダリングテンプレート . 質問にはコードや受け入れられた答えがないことに注意してください。
どのように解決するのですか?
パッケージ
@angular/router
には
Resolve
プロパティを使用しています。そのため、ルートビューをレンダリングする前に、簡単にデータを解決することができます。
参照してください。 https://angular.io/docs/ts/latest/api/router/index/Resolve-interface.html
本日2017年8月28日時点のdocsからの例です。
class Backend {
fetchTeam(id: string) {
return 'someTeam';
}
}
@Injectable()
class TeamResolver implements Resolve<Team> {
constructor(private backend: Backend) {}
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<any>|Promise<any>|any {
return this.backend.fetchTeam(route.params.id);
}
}
@NgModule({
imports: [
RouterModule.forRoot([
{
path: 'team/:id',
component: TeamCmp,
resolve: {
team: TeamResolver
}
}
])
],
providers: [TeamResolver]
})
class AppModule {}
これで、データが解決されて返されるまで、ルートは有効になりません。
コンポーネントで解決されたデータにアクセスする
実行時にコンポーネント内から解決されたデータにアクセスするには、2つの方法があります。したがって、ニーズに応じて、どちらかを使用することができます。
-
route.snapshot.paramMap
という文字列を返すか -
route.paramMap
はObservableを返すので.subscribe()
に変換します。
例
// the no-observable method
this.dataYouResolved= this.route.snapshot.paramMap.get('id');
// console.debug(this.licenseNumber);
// or the observable method
this.route.paramMap
.subscribe((params: ParamMap) => {
// console.log(params);
this.dataYouResolved= params.get('id');
return params.get('dataYouResolved');
// return null
});
console.debug(this.dataYouResolved);
お役に立てれば幸いです。
関連
-
[解決済み】アンギュラーコンポーネントにサービスを注入しようとするとエラー "EXCEPTION: Can't resolve all parameters for component"、なぜ?
-
[解決済み] JavaScript の Promise が解決するのを待ってから機能を再開するにはどうすればよいですか?
-
[解決済み] Angular2:コンポーネントをレンダリングする前にデータをロードする方法は?
-
[解決済み] コンポーネントクラスからテンプレート参照変数にアクセスする
-
[解決済み] .tsファイルはTypeScriptのコンパイルの一部ですが、使用されていませんという警告を消すには?
-
[解決済み] RxJSのmap演算子でエラーを出す方法 (angular)
-
[解決済み] Angular 2で入力タグのファイルタイプで選択されたファイルをリセットする方法は?
-
[解決済み] プロパティ 'controls' がタイプ 'AbstractControl' に存在しない Angular 4 [duplicate] 。
-
[解決済み] 新しいAngularでngSrcに相当するものは何ですか?
-
[解決済み] Angular 2+でspec.tsファイルなしでComponentを生成する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular 4/5/6 グローバル変数
-
[解決済み] angular-cliのパラメータ --base-href と --deploy-url の違いは何ですか?
-
[解決済み] Angular 2のFormGroupからすべての検証エラーを取得する
-
[解決済み] 簡単なパイプで小数点以下2桁に制限する
-
[解決済み] angular-cli server - APIリクエストを別のサーバーにプロキシする方法は?
-
[解決済み] コンストラクタ注入を行わずにサービスのインスタンスを取得する
-
[解決済み] Angular - ngForの中のngIfの中のパラメータを持つng-template [重複]。
-
[解決済み] Angular 2+でspec.tsファイルなしでComponentを生成する。
-
[解決済み] Angular2 *ngIf テンプレート内のオブジェクト配列の長さをチェックする
-
[解決済み] Angular2のTypescriptで文字列を日付に変換するには?重複