Подтвердить что ты не робот

Angular 2 Компонент прослушивания изменений в сервисе

У меня есть простой вопрос об обнаружении изменений.

У меня есть компонент и (глобальная) служба с булевым внутри. Как я могу заставить компонент прослушивать это логическое значение и выполнять функцию, если это логическое значение изменяется?

Спасибо!

4b9b3361

Ответ 1

В зависимости от того, как эти логические изменения вы можете выставить в качестве Observable<boolean> в своей службе, а затем подписаться на этот поток в своем компоненте. Ваш сервис будет выглядеть примерно так:

@Injectable()
export class MyBooleanService {
    myBool$: Observable<boolean>;

    private boolSubject: Subject<boolean>;

    constructor() {
        this.boolSubject = new Subject<boolean>();
        this.myBool$ = this.boolSubject.asObservable();
    }

    ...some code that emits new values using this.boolSubject...
}

Тогда в вашем компоненте у вас будет что-то вроде этого:

@Component({...})
export class MyComponent {
    currentBool: boolean;

    constructor(service: MyBooleanService) {
        service.myBool$.subscribe((newBool: boolean) => { this.currentBool = newBool; });
    }
}

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

Другой вариант заключается в том, что вы используете асинхронный канал внутри вашего шаблона вместо явной подписки на поток в конструкторе. Опять же, это зависит от того, что именно вам нужно делать с значениями bool.

Ответ 2

Ответ Сэма совершенно прав. Я просто хотел бы добавить, что вы также можете использовать установщик TypeScript для автоматического запуска события для изменений:

@Injectable()
export class MyBooleanService {
    myBool$: Observable<boolean>;

    private boolSubject: Subject<boolean>;

    constructor() {
        this.boolSubject = new Subject<boolean>();
        this.myBool$ = this.boolSubject.asObservable();
    }

    set myBool(newValue) {
      this._myBool = newValue;
      this.boolSubject.next(newValue);
    }
}