web-dev-qa-db-ja.com

現在のAngular 2コンポーネントをリロードする方法

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のクラスプロパティが変更されますが、外部スクリプトを有効にするにはコンポーネントをリロードする必要があります。

6
Dave

*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;
  }
}
17

コンポーネントをリロードする必要がある理由がわかりません。 uidproductのさまざまなフィールドにバインドしている場合、それを再ロードするとコンポーネントに表示される値が更新されます。そのため、コンポーネントをリロードするとオーバーヘッドが追加されます。

ここに記載されていない素晴らしい理由があり、なぜこれを行う必要があると思われるのかを説明します。

  1. 別の(おそらく空白の)コンポーネントに移動します。
  2. 直接戻る。

問題は、最初のナビゲーションが完了するのを待ってから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サービスを作成するか、アプリコンポーネントのコンストラクター、またはルーティングモジュールまたは適切な場所に移動します。

2
Cobus Kruger