Можно ли изменить поставщика компонента в диалоговом окне Angular Material Dialog?

У меня есть компонент с InjectionToken и пользовательский провайдер для получения данных из хранилища. При базовом использовании компонента мне нужно предоставить данные с «логинами пользователей», но в диалоговом окне мне нужно получить «имена пользователей» с тем же компонентом. Можно ли передать другой инжектор или как-то использовать другого провайдера в компоненте с диалогом материалов?

InjectionToken

      const USERS = new InjectionToken<Observable<string[]>>(
  'A stream with user's login or name'
);

Провайдеры

      const userLoginProvider: Provider = {
  provide: USERS,
  deps: [ Store ],
  useFactory: (store: Store) => store.pipe(select(userLoginSelector)),
};

const userNameProvider: Provider = {
  provide: USERS,
  deps: [ Store ],
  useFactory: (store: Store) => store.pipe(select(userNameSelector)),
};

Класс компонента

      @Component({
  selector: 'app-users',
  templateUrl: './users.component.html',
  styleUrls: [ './users.component.scss' ],
  providers: [userLoginProvider],
})
export class UsersComponent implements OnInit {

  constructor(@Inject(USERS) public users$: Observable<string[]>) { }

  public ngOnInit(): void {
  }

}

Шаблон компонента

      <div *ngIf="users$ | async as users">
  <div *ngFor="let user of users">
    // show list of logins or names
  </div>
</div>

Использование диалога где-то в другом компоненте:

      const dialog = this.matDialog.open(UsersComponent);

Я предложил что-то вроде этого:

      const namesInjector = Injector.create({
      providers: [
        {
          provide: USERS,
          useValue: userNameProvider,
        },
      ],
      parent: this.injector,
    });

const dialog = this.matDialog.open(UsersComponent, {
 // usage of custom injector somewhere there
});

Я знаю, что могу использовать пользовательский ComponentFactoryResolver в MatDialogConfig, но я понятия не имею, как это сделать и использовать с настраиваемым инжектором. Кстати, я могу использовать свойство данных в MatDialogConfig, чтобы изменить user$ в компоненте, но это выглядит как бессмыслица.

0 ответов