Angular 2で同じコンポーネントを再度リロードするにはどうすればよいですか?
以下は私のコードです:
_import { Component, OnInit, ElementRef, Renderer } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { productModel } from '../_models/index';
import { categoryListService } from '../_services/index';
@Component({
selector: 'app-product',
templateUrl: 'product.component.html',
styleUrls: ['product.component.css']
})
export class productComponent implements OnInit {
uidproduct: productModel;
param: number;
constructor(
private elementRef: ElementRef,
private route: ActivatedRoute,
private router: Router,
private categoryListService: categoryListService) { }
ngOnInit() {
this.route.params.subscribe(product => {
console.log('logging sub product obj', product);
});
this.uidproduct = JSON.parse(sessionStorage.getItem('product'));
var s = document.createElement("script");
s.type = "text/javascript";
s.src = "http://this/external/script/needs/to/be/loaded/each/time.js";
this.elementRef.nativeElement.appendChild(s);
}
nextproduct(){
let i = this.uidproduct.order;
this.categoryListService.findNextproduct(this.uidproduct);
this.param = ++i;
this.router.navigate([`/product/${this.param}`]);
}
}
_
nextproduct()
は、テンプレート内のクリックイベントにバインドされます。
uidproduct
は多くのプロパティを持つJSONオブジェクトであり、DOMを_{{uidproduct.classname}}
_で更新しています
私はこれを次のようにテンプレートで使用しています:
_<div id="selected-product" class="{{uidproduct.classname}}">
_
<button (click)="nextproduct()">
をクリックすると、DOMのクラスプロパティが変更されますが、外部スクリプトを有効にするにはコンポーネントをリロードする必要があります。
*ngIf
を使用して、テンプレートのコンテンツを再レンダリングできます。
@Component({
selector: '...',
template: `
<ng-container *ngIf="!rerender">
template content here
</ng-container>`
})
export class MyComponent {
rerender = false;
constructor(private cdRef:ChangeDetectorRef){}
doRerender() {
this.rerender = true;
this.cdRef.detectChanges();
this.rerender = false;
}
}
コンポーネントをリロードする必要がある理由がわかりません。 uidproduct
のさまざまなフィールドにバインドしている場合、それを再ロードするとコンポーネントに表示される値が更新されます。そのため、コンポーネントをリロードするとオーバーヘッドが追加されます。
ここに記載されていない素晴らしい理由があり、なぜこれを行う必要があると思われるのかを説明します。
問題は、最初のナビゲーションが完了するのを待ってから2番目のナビゲーションを行う必要があることです。
コンポーネントで、NavigationEndをインポートします。
_import { Router, NavigationEnd } from '@angular/router';
_
そして、コンストラクタでサブスクライブします:
_constructor(private thingService: ThisThingService, private router: Router) {
router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
if (event.url === '/blank') {
this.router.navigate(['product']);
}
}
});
_
NavigationEnd
が発生するのを待ってから、空のコンポーネントにルーティングしているかどうかを確認します。空白のコンポーネントのパスである場合、製品に戻ります。そのIDを本当に渡す必要がある場合は、オブジェクトに保存して、ここに追加します。
nextproduct()
で製品ページにルーティングする代わりに、blank
に移動します。
_this.router.navigate(['blank']);
_
そして、これでコンポーネントが完全にリロードされます。
簡単にするために意図的に残した問題は、コンストラクターのsubscribe
呼び出しがリロードごとに実行されることです。読者へのエクササイズとして、コンストラクターから取り出して、そのためのNiceサービスを作成するか、アプリコンポーネントのコンストラクター、またはルーティングモジュールまたは適切な場所に移動します。