Желаемый результат не представляется возможным, используя только шаблоны, потому что круговые причины зависимостей:
ИСКЛЮЧЕНИЕ: Неожиданное значение директивы «не определено» на Вид компонента «ChildComponent»
как вы может видеть на this Plunker, что является признаком того, что что-то пошло не так (общая проблема DI не угловая).
ParentComponent зависит от ребенка:
import {Component} from 'angular2/core';
import {AppComponent} from './app.component';
import {ChildComponent} from './child.component'
@Component({
selector: 'parent',
template: `<p>parent</p>
<child></child>`,
directives: [ChildComponent]
})
export class ParentComponent {
constructor() {}
}
ChildComponent зависит от родителя, который вызывает циклическую зависимость:
import {Component} from 'angular2/core';
import {AppComponent} from './app.component';
import {ParentComponent} from './parent.component';
@Component({
selector: 'child',
template: `<p>child</p>
<parent></parent>`,
directives: [ParentComponent]
})
export class ChildComponent {
constructor() {}
}
Однако вы можете достичь этого с помощью DynamicComponentLoader, как вы можете видеть в этом example, но помните, чтобы обеспечить какое-то условие, чтобы остановить бесконечный рендеринг компонентов. В моем примере условие ввода параметров в родительском компоненте:
import {Component, Input} from 'angular2/core';
import {AppComponent} from './app.component';
import {ChildComponent} from './child.component'
@Component({
selector: 'parent',
template: `<p>parent</p>
<child *ngIf="condition"></child>`,
directives: [ChildComponent]
})
export class ParentComponent {
constructor() {
}
@Input() condition: bool;
}
Я только на моем телефоне и не может запустить Plunker, но, по словам yozr ответ вы пропустили 'forwardRef'. Есть несколько ответов, которые демонстрируют, как их использовать. (downvote был не мной) –
forwardRef не разрешает проблему впрыска зависимостей, потому что это просто круговая зависимость, которая вызывает исключение, когда Angular пытается разрешить зависимости для директив, используемых в текущем компоненте. Также в этом случае не работают операторы условий, используемые как флаги, такие как логический вход в компонент parrent, используемый как условие существования дочернего компонента. Вопрос в том, почему нет подходящего исключения для этой проблемы? –
Почему это возможно с Angular1, а не Angular2? Как можно попытаться использовать dynamicComponentLoader для достижения этого? –