Angular 7 передает переменную из компонента в app.component.ts

Пытаясь передать переменную в 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();
}
@Output() не будет использоваться со службой. Он используется с компонентами. Проверить Родитель и дети общаются через сервис
Alexander Staroselsky 06.02.2019 17:35

Хм, дай посмотреть. Я получил этот код отсюда: medium.com/@mirokoczka/…

Mark 06.02.2019 17:40
stackoverflow.com/questions/50647693/…
Alexander Staroselsky 06.02.2019 17:46
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
3
2 460
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Декораторы @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()? Мне нужно, чтобы он слушал, когда переменная изменяется?

Mark 06.02.2019 18:06

Обязательно послушайте OnInit, но, как уже упоминалось, структура вашего приложения также может иметь значение. В какие модули входят компонент вашего приложения, компонент панели навигации и служба?

MichaelSolati 06.02.2019 18:08

Я обновил код выше. nav.component.ts является частью global.module.ts. global.module.ts был добавлен в импорт [] в app.module.ts.

Mark 06.02.2019 18:19

В app.component.ts отображается, что он вызывается ngOnit(), но никогда больше, когда он обновляется из nav.component.ts.

Mark 06.02.2019 18:24

Не могли бы вы удалить любую ссылку на глобальную службу из глобального модуля и импортировать ее только в модуль приложения. Возможно, существует два экземпляра службы, и ваша проблема связана с этим. В противном случае мне может понадобиться увидеть StackBlitz

MichaelSolati 06.02.2019 18:30

Ты понял, приятель. У меня есть ссылка на службу в моих провайдерах [] в global.component.ts, которая убивала вещи. после удаления работает. Спасибо!

Mark 06.02.2019 18:49

Другие вопросы по теме