Angularでコンポーネントを更新する方法


84

私はAngularプロジェクトに取り組んでいます。コンポーネントの更新アクションに苦労しています。

ボタンクリックでルーターのコンポーネントを更新したいと思います。更新ボタンをクリックすると、コンポーネント/ルーターを更新する必要があります。

私は試しましたがwindow.location.reload()location.reload()これら2つは私のニーズには適していません。誰かがそれを知っているなら助けてください。


この質問でコードを共有できますか?あなたが試していること。
チャンドル2017

これは複雑なコードであり、N行のコードがあり、共有するのが困難です
Sreehari Ballampalli 2017

@Saurabh、通常はコンポーネントをリロードする必要はありません。関数を作成して(たとえば、「restart」を呼び出す)、[更新]ボタンで関数を呼び出すことができます。あなたが変更パス、または別のサービスに加入する必要がある場合は、関数は-あなたのコンポーネント必見OnInit-拡張ngOnInit、ないコンストラクタを使用
エリセオ

これは私が角度9でやったことあるstackoverflow.com/a/60909777/1072395
Wlada

回答:


114

以下のようにコードを調査して変更した後、スクリプトは機能しました。条件を追加しました:

this.router.navigateByUrl('/RefreshComponent', { skipLocationChange: true }).then(() => {
    this.router.navigate(['Your actualComponent']);
}); 

1
私はこれを注射可能なサービスで使用しています。"your actualComponent"変数に置き換えました。に設定されている変数はthis.location.path()、を呼び出す前にに設定されnavigateByUrlます。そうすれば、呼び出しコンポーネントからパラメータを渡したり、ルートを複製/渡したりする必要はありません。
Tewr

4
「RefrshComponent」と「YouractualComponent」とは何か説明していただけますか?
reverie_ss

15
ほとんどの人は、'/'where /RefrshComponentisを使用して問題なく使用[Your actualComponent"]できますthis.router.navigate(["/items"])。そのため、リロードするURL(および/またはパラメータ)を渡すだけです。このハックは基本的に最上位のURLにリダイレクトされ、その後すぐに目的のURLに戻ります。これはほとんどのユーザーには気付かれず、これを簡単に実現するための最も洗練されたハックのようです。
sofly

2
これは間違いなく機能するはずです...しかし、私のアプリ(Angular 6)では失敗します。'/'ダミールートとして使用すると、redirectToapp-routing.module.tsが''(空の文字列)のパスでリダイレクトされて停止する場所に(経由で)移動し、navigate()呼び出しの完了ルートに進みません。存在しない文字列(例/foo)をダミールートとして使用するとredirectTo、app-routing.module.tsが**(他のすべての)リダイレクト先に(経由で)移動し、実際のルートに移動せずに再び停止します。不思議なことに、URLバーは実際のルートに変わります。ここで何が違うのかについて何か考えはありますか?
MichaelSorens19年

1
慎重に使用されていない場合、これは、無限のリダイレクトループが発生する可能性があります
トマス・カッツを

64

this.ngOnInit();を使用します。ページ全体をリロードする代わりに、同じコンポーネントをリロードします!!

DeleteEmployee(id:number)
  {
    this.employeeService.deleteEmployee(id)
    .subscribe( 
      (data) =>{
        console.log(data);

        this.ngOnInit();

      }),
      err => {
        console.log("Error");
      }   
  }

5
これは著者の質問に答えるかもしれませんが、説明する言葉やドキュメントへのリンクが不足しています。生のコードスニペットは、周りにいくつかのフレーズがないとあまり役に立ちません。また、良い答えを書く方法が非常に役立つ場合があります。回答を編集してください。
こんにちは、2018年

1
これは、選択した回答よりも優れた入力ですが、説明が不足しています。私の特定のケースでは、子コンポーネントを更新する必要がありました。その場合、いくつかの方法がありますが、サービスを使用するか、親から子にイベントをブロードキャストすることをお勧めします。
クラウディオ

5
同意しました。これは、コンポーネント内からコンポーネントを更新する場合にのみ機能します。子/外部コンポーネントを処理している場合、this.ngOnInit()は機能しません
astro88 9119年

3
コンポーネントに対しては機能しますが、フォームバリデーターはリセットされません。
VickyGonsalves19年

1
完璧に動作します、ありがとう。そして、AFAICの説明に関しては、コードがすべてを示しています。
マートンタタイ

27

これを必要なコンポーネントのコンストラクターのコードに追加すると、うまくいきました。

this.router.routeReuseStrategy.shouldReuseRoute = function () {
  return false;
};

this.mySubscription = this.router.events.subscribe((event) => {
  if (event instanceof NavigationEnd) {
    // Trick the Router into believing it's last link wasn't previously loaded
    this.router.navigated = false;
  }
});

確認してくださいunsubscribeここからmySubscriptionの中でngOnDestroy()

ngOnDestroy() {
  if (this.mySubscription) {
    this.mySubscription.unsubscribe();
  }
}

詳細については、このスレッドを参照して ください-https://github.com/angular/angular/issues/13831


15

幸い、Angular 5.1以降を使用している場合は、ネイティブサポートが追加されているため、ハッキングを実装する必要はありません。RouterModuleオプションでonSameUrlNavigationを「reload」設定する必要があります。

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: ‘reload’})],
 exports: [RouterModule],
 })

詳細については、https//medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2をご覧ください。


router.onSameUrlNavigation = 'reload'注入されたルーターのプロパティも使用できます。
0zkr PM 2018

4
角度6を使用すると、これは違いがありませんでした。つまり、コンポーネントはリロードされませんでした。ただし、受け入れられた回答は機能します。
Tewr

4
ドキュメントでonSameUrlNavigationは完全には明確ではありませんが、Guards / Resolverを再起動することを目的としており、すでにルーティングされているコンポーネントをリロードすることを目的としていません。詳細については、github.com / angular / angular / issues / 21115を参照してください。このソリューションは、Guards / Resolversを使用するより大規模で複雑なアプリケーションでは機能しますが、簡単な例では失敗します。
sofly

1
はい、onSameUrlNavigationは再びナビゲーションイベントを発生させますが、これはコンポーネントを再ロードしない
ポール・ストーリー

6

これは箱から出して少しだけで、これがあなたに役立つかどうかはわかりませんが、試してみました

this.ngOnInit();

その関数なので、そこにあるコードはすべて、更新のように呼び出されます。


3

これを行うだけです:(角度9の場合)

import { Inject } from '@angular/core';    
import { DOCUMENT } from '@angular/common';

constructor(@Inject(DOCUMENT) private document: Document){ }

someMethode(){ this.document.location.reload(); }

2
OPのコメントを読んでください。ページ全体を
更新

質問は、ページ全体ではなく、コンポーネントのリロードのみを要求します。
サントッシュ

2

これは、ハックを介して実現できます。サンプルコンポーネントに移動してから、リロードするコンポーネントに移動します。

this.router.navigateByUrl('/SampleComponent', { skipLocationChange: true });
this.router.navigate(["yourLandingComponent"]);

SampleComponentは、プロジェクト内の空のコンポーネントまたは別のコンポーネントである必要があることを意味しますか?
Sreehari Ballampalli 2017

それはダミーのものでなければならず、空にすることができます
Sajeetharan 2017

OK、これを試してみます
Sreehari Ballampalli 2017

trueを指定すると、エラーメッセージが表示されます。[ts]タイプ「true」にはタイプ「NavigationExtras」と共通のプロパティがありません
Sreehari Ballampalli 2017

@SreehariBallampalliは更新された回答を確認し、オブジェクトを渡す必要があります{skipLocationChange:true}
Sajeetharan 2017

2

私のアプリケーションにはコンポーネントがあり、すべてのデータはコンポーネントのコンストラクターで呼び出しているAPIから取得されます。ページデータを更新するためのボタンがあります。ボタンをクリックすると、バックエンドにデータを保存し、データを更新します。したがって、コンポーネントをリロード/更新することは、私の要件に従って、データを更新することだけです。これも要件である場合は、コンポーネントのコンストラクターで記述されたものと同じコードを使用してください。


2

明示的なルートなしのもう1つの方法:

async reload(url: string): Promise<boolean> {
  await this.router.navigateByUrl('.', { skipLocationChange: true });
  return this.router.navigateByUrl(url);
}

1

kdo

// reload page hack methode

push(uri: string) {
    this.location.replaceState(uri) // force replace and no show change
    await this.router.navigate([uri, { "refresh": (new Date).getTime() }]);
    this.location.replaceState(uri) // replace
  }

1
constructor(private router:Router, private route:ActivatedRoute ) { 
}

onReload(){
 this.router.navigate(['/servers'],{relativeTo:this.route})
}

0

htmlファイル

<a (click)= "getcoursedetails(obj.Id)" routerLinkActive="active" class="btn btn-danger">Read more...</a>

tsファイル

  getcoursedetails(id)
  { 
  this._route.navigateByUrl('/RefreshComponent', { skipLocationChange: true }).then(() => {
    this._route.navigate(["course",id]);
  }); 

-3

このようにAngular2でページを更新する(難しい方法)他の方法は、 f5のようになります

import { Location } from '@angular/common';

constructor(private location: Location) {}

pageRefresh() {
   location.reload();
}

1
彼は、ページ全体をリロードすることは適切ではないと述べました。これは、単一/複数のコンポーネントだけでなく、ページ全体をリロードします。
ミラノヴェレビト2018

Angular Location Serviceにリロードがないことを除いて、これを使用することになったので、windowを使用しました。
ポールストーリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.