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