Внедрение различных родительских компонентов в дочерний компонент - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь решить следующую ситуацию:

У меня есть дочерний компонент, который будет использоваться в нескольких родительских компонентах, но этот дочерний компонент должен иметь доступ к родительскому компоненту (а именно к его информации parenComponent.constructor по адресу время выполнения).

В такой структуре

<BucketComponent>
    <ParentA>
       <ChildComponent>
    </ParentA>
    <ParentB>
       <ChildComponent>
    </ParentB>
<BuccketComponent>

До того, как этот ChildComponent был передан родителям, я сделал следующее

ChildComponentCode

component({
  selector: 'childComponent'
})
export class ChildComponent extends BaseClass<model> implements OnInit, OnDestroy {

  constructor(@Inject(ParentComponentClass) parent: Component) {
    super(parent);
  }

и это сработало.

Но когда я попытался поделиться им следующим образом:

const token = new InjectionToken<Component>('ParentComponentToken')

component({
  selector: 'childComponent',
providers: [
    { provide: token , useClass: ParentComponentClassA},
    { provide : token , useClass : ParentComponentClassB}]
})
export class ChildComponent extends BaseClass<model> implements OnInit, OnDestroy {

  constructor(@Inject(token) parent: Component) {
    super(parent);
  }

В одном из случаев childcomponent я получил правильную ссылку на своего родителя, но не в другом (выглядит мне нравится, что он всегда ссылается на один из двух)

Кстати, супер (родитель); это то, что использует информацию parentComponent.constructor.

Дополнительно я уже пытался использовать @Self () и @Host до @Inject (), но безрезультатно.

Любая помощь в том, как я может сделать так, чтобы только родитель, где есть ребенок, был предоставлен / введен, оценен.

Заранее спасибо

1 Ответ

0 голосов
/ 13 марта 2020

Проверьте это руководство . Идея, что родительские компоненты предоставляют информацию о себе через DI, а дочерний компонент внедряет любой экземпляр родительского компонента. Проблема здесь в том, что родительский компонент может быть тем, чего вы не знаете заранее, поэтому для решения этой проблемы лучше ввести абстрактный базовый класс или интерфейс (и использовать InjectionToken) и реализовать его всеми родительскими компонентами, чтобы дать знать дочернему компоненту. какой контракт ожидать.

...