Angularフレームワークを使用してアプリケーションをスムーズに実行するために苦労していますが、ルーティングの問題を解決できません。トップレベルのAppComponent
と_app-routing.module.ts
_を使用して、私のカスタムSlideMenuComponent
。AppComponent
の私の簡略化されたHTMLテンプレート:
_<app-slide-menu [buttons]="menuButtons"></app-slide-menu>
<router-outlet></router-outlet>
_
私のSlideMenuComponent
のコアは次のhtmlです。
_<nav><div *ngFor="let button of buttons">
<a routerLink="{{button.routerLink}}"
>{{button.name}}</a>
</div></nav>
_
ユーザーはこのスライドメニューから_'/courses'
_に移動できます。このスライドメニューは、サーバーから取得された特定のCoursesComponent
sへのリンクをページ分割するCourseComponent
によって監視されます。これらのコンポーネントは、独自の_courses.module.ts
_モジュールと独自の_courses-routing.module.ts
_に常駐します。しかし、これらのリンクのいずれかをクリックすると、Navigation triggered outside Angular zone, did you forget to call 'ngZone.run()'?
コンソール警告が表示され、ngOnInit()
は開いたCourseCompontent
に対して呼び出されず、ページ上のいずれかのボタンをクリックするまで更新されません。このタスクをrouter.navigate()
に転送することで解決されたNgZone.runTask(router.navigate())
を介して手動でナビゲートしたときにこの問題が発生しましたが、anchor
タグとrouterLink
ディレクトリでなぜこれが発生するのですか?これが私のCoursesComponent
コードの抜粋です。
_<nav><ul>
<li *ngFor="let course of api.data | paginate: {
currentPage: currentPage, itemsPerPage: limit, totalItems: api.total
}">
<a
[routerLink]="course._id"
[queryParams]="{ page: '1', limit: '5' }"
>
{{course.name}} ({{course.description}})
</a>
</li>
</ul></nav>
_
問題を示すGIF:
バグが見つかったので、これを回避策として試してください
constructor(private ngZone: NgZone, private router: Router) {}
public navigate(commands: any[]): void {
this.ngZone.run(() => this.router.navigate(commands)).then();
}
受け入れられた回答がなく、見つけたのでAngular 8を使用して、上位にランクされた回答はうまく機能せず、もう少し説明が必要です。以下を追加します。
私の特定の問題はag-gridに関するものでしたが、* ngFor内など、コンポーネントが注入される場所がこの問題を引き起こす可能性があると思います。これは前の回答に非常に似ていますが、代わりに、navigate関数に文字列パラメーターを宣言し、navigateの代わりにnavigateByUrlを呼び出します。
import { Component, NgZone } from '@angular/core';
import { Router } from '@angular/router';
@Component({
template: `<tag (click)="navigate(path)">clickable text</tag>`
})
constructor(private ngZone: NgZone, private router: Router) { }
public navigate(path: string): void {
this.ngZone.run(() => this.router.navigateByUrl(path)).then();
}
あなたの走行距離は異なる場合がありますが、これは私にとっては美しく機能しました。
このバグは、ソリューション内のどこかに移動しているときに発生しました。
サイドバーコンポーネントでは、オンプッシュ変更検出を使用しており、ルーティングが発生したとき(パラメーターの変更)にthis.ref.detectChanges()
が1つありました。これにより、ルーティングが壊れました(ngZoneから並列実行中のリゾルバーを蹴るか、または同様のもの)。これをとにかく優先するthis.ref.markForCheck()
に変更した後、このバグは再び発生しなくなりました。回避策、奇妙な動作が必要なかったのはうれしいです。
これが同じ問題を抱えている人に役立つことを願っています。