Angular 2 Дочерний компонент для проверки родительского компонента

то, что я хочу добиться, - это другое поведение компонента, основанное на том, какой компонент является его родительским компонентом. Таким образом, в следующих двух ситуациях ребенок будет вести себя несколько иначе.

пример А

<parent-a>
<child></child>
</parent-a>

пример Б

<parent-b>
<child></child>
</parent-b>

Я попытался сделать следующее

constructor(
    el: ElementRef) {
      this.el = el; 
  }

  ngAfterViewInit() {
    const hostElem = this.el.nativeElement;
    console.log(hostElem);
    console.log(hostElem.children);
    console.log(hostElem.parentNode);
  }

даже несмотря на то, что ngAfterViewInit немного запаздывает для меня, я все равно получил нуль на parentNode

Есть ли способ добиться чего-то подобного?


person elasticrash    schedule 01.11.2016    source источник
comment
Это не так должно работать. Вместо этого передайте входные данные от родителя дочернему, чтобы сообщить ему, как себя вести.   -  person JB Nizet    schedule 01.11.2016
comment
да, это уже происходит (с сервисом), но что, если родитель не тот, кого я ожидаю? (в основном я создаю API). Я в основном хочу дать ошибку/предупреждения со списком ожидаемых родительских узлов   -  person elasticrash    schedule 01.11.2016


Ответы (1)


Если вам нужен фактический компонент (а не элемент узла), вы можете использовать инжектор.

constructor(private parentB: ParentBComponent){
}

ngAfterViewInit() {
  this.parentB.someMethod()
}

Обратите внимание, что у вас есть parent-a и parent-b, если вы хотите иметь возможность внедрить любой из них, определите базовый компонент и наследуйте от него parent-a и parent-b.

Вы можете сделать это необязательным, вы можете использовать декоратор Optional:

constructor(@Optional() private parentB?: ParentBComponent){
} 
person Meir    schedule 01.11.2016
comment
и если его нет, я могу выдать ошибку, я думаю. это могло бы сделать. Я попробую, прежде чем соглашаться;) - person elasticrash; 01.11.2016
comment
Значение, если это не в контексте этого родителя? В этом случае элемент parentB будет неопределенным. - person Meir; 01.11.2016
comment
Вообще настоятельно не рекомендуется использовать html элементы (parentNode и т.п.), старайтесь делать работу внутри фреймворка и использовать Renderer для обновлений - person Meir; 01.11.2016
comment
Я не хочу ничего обновлять. Моя проблема в том, что в случае, если родитель не является a или b, написать предупреждение и не выполнять какие-либо функции - person elasticrash; 01.11.2016
comment
Большое спасибо, это сработало как шарм, дело в том, что мне вообще не нужно использовать родительские компоненты. Я просто хочу знать, есть ли они там, и если нет, я могу выдать ошибку. - person elasticrash; 01.11.2016
comment
Что, если дочерний компонент находится внутри *ngIf и не создается до тех пор, пока условие не станет истинным? Тогда компонент будет неопределенным в ngAfterViewInit родительского компонента, не так ли? Лишь бы учесть. - person Dani P.; 09.02.2021