我正在try 读取canActivate函数中给定路由上的查询参数,如果不在那里,则显示一个模式,说明它不会正常工作.

当我更多地考虑这一点时,因为它应该只在应用程序第一次启动时发生,我想我将使用APP_INITIALIZER来移动提供程序中的逻辑.

这就是说,我很沮丧,因为我没能正确地注射MAT_DIALOG_DATA,我想:

    1. 下 ==同步,由长者更正==
      1. 查找解决方案

在我分享最小的重现之前,让我向您介绍一下我编写的代码:

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 .

推荐答案

请更新对话框组件代码,我想我们需要使用构造函数内部的注入器才能进行依赖注入!

import { CommonModule } from '@angular/common';
import { Component, Inject, OnInit } from '@angular/core';
import { MatDialogModule, MAT_DIALOG_DATA } from '@angular/material/dialog';

@Component({
  selector: 'app-dialog',
  templateUrl: './dialog.component.html',
  styleUrls: ['./dialog.component.css'],
  standalone: true,
  imports: [CommonModule, MatDialogModule],
})
export class DialogComponent {
  public dialogData: any;

  constructor(@Inject(MAT_DIALOG_DATA) private data: any) {
    this.dialogData = data;
  }
}

stackblitz

Angular相关问答推荐

我使用最新的AuthGuard方法,应该使用路由重定向.UrlTree如果用户未登录但未能登录

在Angular中使用RxJS的viewChild信号时如何避免未定义错误?

升级到angular 17并转换为独立的加载器拦截器后,

无法执行客户端功能Angular 17与ssr'

RXJS运算符用于combineLatest,不含空值

元件不工作时的Angular 17属性 Select 器

懒惰加载角404路径

无法创建新的 Ionic 项目

Angular 9表单构建器 - 日期验证器问题

以 Angular 形式添加动态控件失败

如果我使用 matAutocomplete,为什么 textarea 不显示 formControl 的实际值

console.log 返回 api 数据但 ERROR TypeError: Cannot read properties of undefined reading 'name'

ng14中具有强类型表单的FormBuilder

如何从 RxJS 重试中排除某些 url

过滤 ngfor Angular 的计数

Angular 2 二传手与 ngOnChanges

如何在对话框angular material内对齐按钮?

可从 Angular2 中的

取消订阅服务中的http observable

如何在Angular 2中将对象从一个组件传递到另一个组件?