我正在try 读取canActivate
函数中给定路由上的查询参数,如果不在那里,则显示一个模式,说明它不会正常工作.
当我更多地考虑这一点时,因为它应该只在应用程序第一次启动时发生,我想我将使用APP_INITIALIZER来移动提供程序中的逻辑.
这就是说,我很沮丧,因为我没能正确地注射MAT_DIALOG_DATA
,我想:
-
- 下 ==同步,由长者更正==
-
- 查找解决方案
在我分享最小的重现之前,让我向您介绍一下我编写的代码:
bootstrapApplication(App, {
providers: [
importProvidersFrom(MatDialogModule),
provideRouter([
{
path: '',
component: FooComponent,
canActivate: [
() => {
const dialog = inject(MatDialog);
dialog.open(DialogComponent, {
data: {
helloWorld: true,
},
});
return true;
},
],
},
]),
],
});
我确保导入MatDialogModule
,然后定义一个具有canActivate
的虚拟路由.在这里,我打开一个对话框,try 在其中传递一些数据.
对话框组件定义如下:
export class DialogComponent {
@Inject(MAT_DIALOG_DATA) public dialogData: any;
}
还有那景色
Data received in the dialog:
<pre>{{ dialogData | json }}</pre>
问题是dialogData
在这里总是不定义的.
我怀疑,从canActivate
开始,我得到了一个不同的注射器,它不知何故搞砸了从这里启动数据对话的 idea .但这应该和更换注射器一样容易吗?或者甚至手动覆盖注入器以自己定义MAT_DIALOG_DATA
令牌?
我也试过了,但不管用:
const newInjector = Injector.create({
providers: [
{
provide: MAT_DIALOG_DATA,
useValue: {
helloWorld: true,
},
},
],
parent: inject(Injector),
});
dialog.open(DialogComponent, {
data: {
helloWorld: true,
},
injector: newInjector
});
我也试着在绝望中通过ViewContainerRef
分,但我没想到这会奏效.
我错过了什么吗?有人能解释一下并给出一个变通办法吗?
这是一张Stackblitz repro美元.
EDIT:个
我刚刚试图将我的代码迁移到APP_INITIALIZER
,但我遇到了完全相同的问题,所以我别无 Select .