Пытаясь передать переменную в app.component.ts из другого компонента, я создал службу (см. Global.service.ts ниже).
Это хорошо работает, когда мой nav.component.ts вызывает службу. Однако это не работает в app.component.ts. Я не понимаю, почему, так как код тот же (см. app.component.ts ниже).
Nav.component.ts находится в модуле (global.module.ts). global.module.ts был добавлен в импорт [] в app.module.ts.
Global.service.ts
@Injectable()
export class GlobalService {
private handleError: HandleError;
isOpen = false;
private _change: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
constructor(
private http: HttpClient,
httpErrorHandler: HttpErrorHandler
) {
this.handleError = httpErrorHandler.createHandleError('GlobalService');
}
get change(): Observable<boolean> {
return this._change.asObservable();
}
toggle() {
this.isOpen = !this.isOpen;
this._change.next(this.isOpen);
}
}
app.component.ts
import { Component, OnInit } from '@angular/core';
import { GlobalService } from './globals/global.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
isOpen = true;
constructor(
private _globalService: GlobalService,
) {
}
ngOnInit(): void {
console.info("foo bar");
this._globalService.change.subscribe(isOpen => {
this.isOpen = isOpen;
console.info(this.isOpen);
});
}
}
nav.component.ts
ngOnInit(): void {
//
this.getNav();
this._globalService.change.subscribe(isOpen => {
this.isOpen = isOpen;
this.NavToggle(this.isOpen);
});
}
//Toggle
hideShowSidebar() {
this._globalService.toggle();
}
Хм, дай посмотреть. Я получил этот код отсюда: medium.com/@mirokoczka/…





Декораторы @Output (и @Input) обычно используются для атрибутов/свойств компонентов/элементов для обнаружения событий (и присвоения значений), я бы сказал, что это не лучший способ для Сервиса выпустить обновление для Компонента. Для этого вы можете использовать простой BehaviorSubject и немного изменить свой сервис.
@Injectable()
export class GlobalService {
private handleError: HandleError;
isOpen = false;
private _change: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
constructor(
private http: HttpClient,
httpErrorHandler: HttpErrorHandler
) {
this.handleError = httpErrorHandler.createHandleError('GlobalService');
}
get change(): Observable<boolean> {
return this._change.asObseravble();
}
toggle() {
this.isOpen = !this.isOpen;
this._change.next(this.isOpen);
}
}
Поскольку _change BehaviorSubject предоставляет источник правды для компонентов/классов вне себя, мы не хотим раскрывать его (поскольку его можно легко изменить). Вот почему мы предоставляем его через getter как Observable. Это должно работать, однако, если у вас есть служба, импортированная в поставщиков нескольких модулей, у вас может быть несколько экземпляров службы (и все они не будут иметь одни и те же данные). Если это так, было бы лучше, если бы ваша служба была объявлена только в вашем AppModule.
Так что это работает в моем навигационном компоненте, но не в моем app.component.ts. Возможно, его не следует вызывать из ngOnInit()? Мне нужно, чтобы он слушал, когда переменная изменяется?
Обязательно послушайте OnInit, но, как уже упоминалось, структура вашего приложения также может иметь значение. В какие модули входят компонент вашего приложения, компонент панели навигации и служба?
Я обновил код выше. nav.component.ts является частью global.module.ts. global.module.ts был добавлен в импорт [] в app.module.ts.
В app.component.ts отображается, что он вызывается ngOnit(), но никогда больше, когда он обновляется из nav.component.ts.
Не могли бы вы удалить любую ссылку на глобальную службу из глобального модуля и импортировать ее только в модуль приложения. Возможно, существует два экземпляра службы, и ваша проблема связана с этим. В противном случае мне может понадобиться увидеть StackBlitz
Ты понял, приятель. У меня есть ссылка на службу в моих провайдерах [] в global.component.ts, которая убивала вещи. после удаления работает. Спасибо!
@Output()не будет использоваться со службой. Он используется с компонентами. Проверить Родитель и дети общаются через сервис