2016-01-08 3 views
1

Я экспериментирую с недавно выпущенной Angular2 beta 0 и надеюсь, что кто-то может прояснить некоторые вещи для меня.Angular2: связь между родителями и дочерними компонентами, @Host и forwardRef

У меня есть AppComponent, который служит основной основой моего проекта. Его шаблон создает панель навигации, элементы которой считываются в общедоступную переменную (называть ее «элементами») AppComponent по ее ngOnInit. * ngfor затем отображает предметы. Это работает нормально.

В нижней части шаблона AppComponent находится div, в котором размещается роутер-выход. В зависимости от того, какой элемент навигации выбирается пользователем, запускается и создается другой подкомпонент. Это также отлично работает. В одном из этих подкомпонентов мне нужно обратиться к переменной «items» в родительском AppComponent. Я попробовал три пути прохождения AppComponent субкомпонента в своем конструкторе:

1. constructor(@Host() _host: AppComponent) 
2. constructor(@Inject(forwardRef(() => AppComponent)) _host) 
3. constructor(@Host() @Inject(forwardRef(() => AppComponent)) _host) 

Метод 1 терпит неудачу во время выполнения с ошибкой, как «не может решить все параметры подкомпонента», в то время как методы 2 и 3 работы, но я не Не понимаю почему. Это заставило бы предположить, что AppComponent не определен, когда вызывается конструктор SubComponent, что невозможно, потому что SubComponent не может существовать, если он не отображается в роутер-выходе из шаблона AppComponent. Но прямая ссылка действительно работает.

Я могу написать больше кода, но я думаю, что мне не хватает чего-то концептуального здесь. ??

Боковой вопрос - я вижу в предыдущих альфа-релизах, что декоратор @View часто использовался в определениях компонентов, например. для указания шаблона. Во всех примерах, представленных на веб-сайте Angular, я никогда не вижу @View, но только декоратор @Component. Является ли @View устаревшим?

спасибо большое !!!

+0

Похоже на https://github.com/angular/angular/issues/3216 –

+0

'@View()' предназначена для поддержки нескольких видов для одного компонента. Пока это не будет полностью поддержано, вы можете просто использовать '@Component()'. Если вы планируете использовать эту функцию в любом случае, может быть смысл уже использовать аннотацию '@View()'. –

+0

Спасибо за ссылку и ответ на @View(). Ссылка ссылается на другое сообщение https://github.com/angular/angular/issues/3216, последний комментарий которого объясняет, что загрузчик модуля может оставить «круговые зависимые модули ... неинициализированные в одном из модулей». Я по-прежнему не понимаю, как в процессе запуска моего конкретного приложения загрузчик мог или даже захотел загрузить версию моего SubComponent, которая не знает модуль AppComponent, учитывая, что экземпляр последнего уже фактически существует. В любом случае, forwardRef работает, поэтому я просто буду придерживаться его. Спасибо! –

ответ

Смежные вопросы