mat-dialog 无法在页面加载时正确打开
mat-dialog not opening on page load properly
我试图让 mat-dialog 在加载特定 url 时打开。目前,它仅在您重新加载整页时才有效。我希望它在加载此特定 angular 路由时启动 mat-dialog,无论它是整页加载还是已加载使用 angular 路由器的 angular 应用程序。
我尝试将以下代码放在 ngOnInit()
中,也尝试放在 ngAfterViewInit()
中,但同样的问题。我尝试的另一件事是在获取 userIsAuthenticated 值后立即将其放入构造函数中,但同样的问题。
感谢您的帮助!
ngAfterViewInit() {
if (!this.userIsAuthenticated) {
const dialogRef = this.dialog.open(ConfirmationAgeComponent, {
panelClass: "dialogBoxStyler"
});
dialogRef
.afterClosed()
.pipe(takeUntil(this.destroy))
.subscribe(result => {
if (result) {
this.over21Agreed = true;
}
});
}
}
我还尝试将以下内容添加到构造函数中:
constructor(private router: Router){
this.url = this.router.url;
if (this.url === '/' || this.url.includes('search-results')) {
alert("HERE")
}
}
但警报仅在第一次弹出。如果我单击地址栏中的 url 以突出显示 url 并按回车键,则不会出现警报。
您应该在主 app.component
构造函数中订阅路由器事件,以便能够跟踪导航,例如:
constructor(private router: Router) {
router.events.subscribe((event: RouterEvent) => this.handleEvent(event));
}
handleEvent(event: RouterEvent) {
if (event instanceof NavigationStart) {
// do your thing here using `event.url` for example
}
if (event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError) {
// or here
}
}
可以找到关于 RouterEvent 的文档here
我们以错误的方式使用了angular生命周期。
定义对话框:-
openAgeConfirmationDialog() {
const dialogRef = this.dialog.open(ConfirmationAgeComponent, {
panelClass: 'dialogBoxStyler'
});
dialogRef
.afterClosed()
.pipe(takeUntil(this.destroy))
.subscribe(result => {
if (result) {
// I defined over21Agreed to true so that component appears on screen fyi
this.over21Agreed = true;
}
});
}
然后,在 ngOnInit()
中调用 openAgeConfirmationDialog()
一次,在 ngOninit() 中调用 router.events
一次。
ngOnInit() {
this.openAgeConfirmationDialog();
this.router.events.pipe(
filter((event: RouterEvent) => event instanceof NavigationEnd),
takeUntil(this.destroy),
debounceTime(1000)
).subscribe(() => {
this.openAgeConfirmationDialog();
});
我们正在使用 debounceTime
因为它绕过了路由更改引起的问题。
一种方法是将对话框组件作为 header 组件的 children 放置在路由配置中,并提供您希望对话框组件打开的 'url'作为 header 组件中的 routerLink。看看下面的 stackblitz link。希望这就是您要找的..
我试图让 mat-dialog 在加载特定 url 时打开。目前,它仅在您重新加载整页时才有效。我希望它在加载此特定 angular 路由时启动 mat-dialog,无论它是整页加载还是已加载使用 angular 路由器的 angular 应用程序。
我尝试将以下代码放在 ngOnInit()
中,也尝试放在 ngAfterViewInit()
中,但同样的问题。我尝试的另一件事是在获取 userIsAuthenticated 值后立即将其放入构造函数中,但同样的问题。
感谢您的帮助!
ngAfterViewInit() {
if (!this.userIsAuthenticated) {
const dialogRef = this.dialog.open(ConfirmationAgeComponent, {
panelClass: "dialogBoxStyler"
});
dialogRef
.afterClosed()
.pipe(takeUntil(this.destroy))
.subscribe(result => {
if (result) {
this.over21Agreed = true;
}
});
}
}
我还尝试将以下内容添加到构造函数中:
constructor(private router: Router){
this.url = this.router.url;
if (this.url === '/' || this.url.includes('search-results')) {
alert("HERE")
}
}
但警报仅在第一次弹出。如果我单击地址栏中的 url 以突出显示 url 并按回车键,则不会出现警报。
您应该在主 app.component
构造函数中订阅路由器事件,以便能够跟踪导航,例如:
constructor(private router: Router) {
router.events.subscribe((event: RouterEvent) => this.handleEvent(event));
}
handleEvent(event: RouterEvent) {
if (event instanceof NavigationStart) {
// do your thing here using `event.url` for example
}
if (event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError) {
// or here
}
}
可以找到关于 RouterEvent 的文档here
我们以错误的方式使用了angular生命周期。
定义对话框:-
openAgeConfirmationDialog() {
const dialogRef = this.dialog.open(ConfirmationAgeComponent, {
panelClass: 'dialogBoxStyler'
});
dialogRef
.afterClosed()
.pipe(takeUntil(this.destroy))
.subscribe(result => {
if (result) {
// I defined over21Agreed to true so that component appears on screen fyi
this.over21Agreed = true;
}
});
}
然后,在 ngOnInit()
中调用 openAgeConfirmationDialog()
一次,在 ngOninit() 中调用 router.events
一次。
ngOnInit() {
this.openAgeConfirmationDialog();
this.router.events.pipe(
filter((event: RouterEvent) => event instanceof NavigationEnd),
takeUntil(this.destroy),
debounceTime(1000)
).subscribe(() => {
this.openAgeConfirmationDialog();
});
我们正在使用 debounceTime
因为它绕过了路由更改引起的问题。
一种方法是将对话框组件作为 header 组件的 children 放置在路由配置中,并提供您希望对话框组件打开的 'url'作为 header 组件中的 routerLink。看看下面的 stackblitz link。希望这就是您要找的..