Можно ли изменить поставщика компонента в диалоговом окне 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$ в компоненте, но это выглядит как бессмыслица.