#angular #rxjs
Вопрос:
У меня есть динамически загружаемая навигация, которая в настоящее время работает в определенной степени. При начальной загрузке все в порядке, если вы перемещаетесь по сайту, различные элементы, которые вы нажимаете, выделяются как активные, когда вы нажимаете на них.
Это загружается из компонента (NavComponent), который OnInit вызывает службу (navService) и получает соответствующие элементы навигации.
Однако, если в содержимом одной из отображаемых страниц есть ссылка, которая, например, возвращается на главную страницу-ссылка работает, страница отображается, но навигация не обновляется, чтобы выделить новый элемент навигации. Это потому, что я не использую routerLinkActive и т. Д. Для оформления ссылок, так как это не сработает для меня. Вместо этого я повторяю каждый элемент навигации и применяю соответствующие стили. Эта итерация выполняется только при нажатии на навигационный элемент, если пользователь переходит на маршрут по ссылке, отличной от нажатия на навигационный элемент, то навигационная система не обновляется.
Я решил, что решение этой проблемы состоит в том, чтобы использовать тему, подписаться на нее, а затем для любых ссылок за пределами самой навигации позвонить next() по этой теме, и навигация должна обновиться соответствующим образом.
Теоретически это казалось разумным, но на самом деле, когда я подписываюсь на свой Предмет, я не получаю никаких ценностей обратно. Из чтения в Интернете это может быть вызвано тем, что подписка происходит до того, как будет вызвана следующая. Поэтому в качестве взлома в моем навигационном компоненте я сначала вызвал updateNav (), который является вызовом службы, который заполняет следующий (), затем я вызываю getNav (), который подписывается на тему.
Учитывая, что я буквально только что позвонил в следующий раз по следующей строке, на которую я подписался, я бы подумал, что должны быть возвращены данные, но все равно ничего.
Это и есть услуга
private navSubject = new Subject<any>;
updateNav(){
this.navSubject.next(getNavItems());
}
getNav(){
return this.navSubject.asObservable();
}
getNavItems(){
// does a http request and returns an observable of nav items.
}
Есть идеи, почему моя тема пуста, несмотря на то, что я позвонил в updateNav прямо перед подпиской? Я подумал, может быть, это потому, что у Субъекта нет начального значения, поэтому я перешел на объект поведения, но конечный результат был тот же.
Комментарии:
1. Если вы делаете http-запрос, вам следует дождаться ответа метода, а затем присвоить значение
Subject