Я пытаюсь передать конкретный экземпляр Сервиса компонентам, которые находятся внутри модала ngx-bootstrap.
Однако, поскольку модал не является потомком компонента, который запускаетмодал не может разрешить зависимость службы, если я пытаюсь внедрить ее.
Я могу передать службу как данные при открытии модала, а затем как вход для дочернего модала этого, и это работает, ноэто не похоже на правильный способ сделать это.
Я не хочу, чтобы служба предоставлялась в виде: 'root' или предоставлялась в модуле, поскольку она содержит постоянные данные в течение срока службы компонента, предоставляющего его.а также наличие функций, использующих эти данные.
Я смотрел на прохождение инжектора при открытии модального режима, но кажется, что ngx-bootstrap не поддерживает эту опцию.Единственный пример прохождения пользовательского инжектора, который я нашел, был для ng-bootstrap.
Передача Сервиса в качестве данных модальному, кажется нормальным, если я не могу передать инжектор модальному, но я все еще хотел бычтобы иметь возможность внедрять его в дочерние элементы базового модального компонента.
Пример Stackblitz (передача службы в качестве данных, а затем в качестве ввода):
Mainкомпонент:
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
providers: [AppService],
})
export class AppComponent {
modalRef: BsModalRef;
constructor(private modalService: BsModalService, private appService: AppService, private injector: Injector) {}
openModal() {
this.appService.increment();
this.modalRef = this.modalService.show(SomeComponent, {
initialState: {
title: 'Modal title',
appService: this.appService,
},
});
}
}
Модальный компонент:
export class SomeComponent implements OnInit {
appService: AppService;
title;
constructor(
public modalRef: BsModalRef,
) {
}
ngOnInit() {
}
}
Дочерний элемент некоторого компонента:
export class ChildComponent implements OnInit {
constructor(
public modalRef: BsModalRef,
) { }
@Input() appService: AppService;
count: number = 0;
ngOnInit() {
this.count = this.appService.num;
}
}
В идеале мне бы хотелось, чтобы он работал аналогично нг-bootstrap делает это, когда я могу передать пользовательский инжектор модальному, подобному следующему:
this.modal.open(SomeComponent, {
injector: Injector.create([{
provide: AppService, useValue: this.appService
}], this.injector)
})
Возможность добавить AppService к инжектору SomeComponent также будет хорошей, но из того, что я пробовал, есть только способыВнедрить его можно будет во время создания компонента, а AppService не будет определен, пока в SomeComponent не будет запущен ngOnInit.
Мне кажется, что что-то подобное будет работать и в некоторыхКомпонент:
constructor(@Inject(forwardRef(() => returnObservableForAppService)) appServiceObsv: Observable<AppService>) { }
Но внедрение Observable вместо фактического сервиса выглядит примерно так же, как просто передача его в качестве ввода.