через ViewChild со static:false, далее его передаю через инпут в дочерний компонент. Получается на ngAfterViewInit инпут имеет свойство сначала null, потом элемент из viewChild и поэтому ошибка NG0100. Как от нее уходить? Если запускать вручную detectChanges() ошибка уходит, но нормальное ли это решение?
Можно static: true проставить, тогда тоже ошибка уйдет. Но это тоже как костыль выглядит. Если передать в input сразу шаблонную переменную #elem, то тоже ошибки нет и не пойму почему.
Зачем приходится прокидывать компонент дочернему? Дочерний может сам себе его получить через DI..
Дочернему компоненту нужен не сам компонент, а определенный div. Вопрос именно как правильно его передать? Получается тут реально свойства сначала не было, а при повторной проверке появилось
дочерний компонент является потомком div?
Да, но необязательно. И почему если передать не свойство из ViewChild, а сам элемент #element то ошибки нет?
Ну так родительский вы можете через конструктор вполне получить, а у него уже объявить нужный метод, позволяющий вам этот div получить
потому что #element доступен до onInit
#element это viewChild со static:true получается?
Это да, но если не родительский например. Хочется именно причину ошибки понять и как уйти.
не могу точно ответить на этот вопрос (
Если ваш дочерний компонент является потомком этого div, вы можете сделать директиву, и инжектить её в дочернем компоненте. Пример: @Directive({ selector: '[parentDiv]', standalone: true, }) export class ParentDivDirective { readonly element = inject(ElementRef<HTMLDivElement>); } Далее в дочернем компоненте делать так: class Component { readonly parentDivDirective = inject(ParentDivDirective); } ну и обращаться к элементу через this.parentDivDirective.element.nativeElement.
От ошибки NG0100 можно уйти, если ngAfterViewInit в отдельно свойство myElement положить значение из ViewChild и вручную запустить .detectChanges. Angular ещё раз пересчитает свойства и при повторном пересчете значения будут совпадать. Это костыль или нет)?
Это да, тут понятно. Но по идее я просто получаю div через viewChild и отдаю это свойство в инпут, в итоге ошибка) Вроде обычную простую вещь делаю
Вы просто заново дёргаете проверку изменений. Да, получается костыль. Желательно стараться делать так, чтобы такая ошибка не возникала вообще. То есть избегать изменения состояния во время проверки изменения состояния.
А viewChild со static:true костыль? в этом случае viewChild будет сразу элемент содержать и ошибки не возникнет
ViewChild со static: true не костыль. Но прокидывать родительский элемент в дочерний всё таки похоже на костыль.
Понял, спасибо. Но вот не понял почему костыль прокидывать родителя дочернему элементу. Есть дропдаун, которому нужно передать элемент к которому он привязывается и рассчитывается его позиция, передача реализована через Input
посмотри @angular/cdk/overlay, вероятно ты изобретаешь велосипед со своим дропдауном
Ок, спасибо гляну. Но я велосипед изобретаю, чтобы лучше понять как работает все)
Я бы это сделал так:
Инжектить получается элемент к которому цепляться, верно?
Обсуждают сегодня