Он бы автоматически обновлялся, если бы эти служебные переменные имели сложный тип, такой как Object или Array, поскольку они являются ссылочными типами. Но поскольку у вас есть служебные переменные типа number и boolean, они не будут обновляться автоматически, поскольку они являются примитивными типами и, следовательно, передаются по значению.
Так что вам придется использовать BehaviorSubject
s и выставлять их asObservable
s. Вы обновите значения этих BehaviorSubject
s, вызвав для них метод next
. Вот как это сделать:
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class TestService {
private myNumberValue = 0;
private isOddValue = false;
private myNumber: BehaviorSubject<number> = new BehaviorSubject<number>(this.myNumberValue);
private isOdd: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
myNumber$: Observable<number> = this.myNumber.asObservable();
isOdd$: Observable<boolean> = this.isOdd.asObservable();
constructor() {}
increaseNumber() {
this.myNumberValue = this.myNumberValue + 1;
this.myNumber.next(this.myNumberValue);
this.isOddValue = !this.isOddValue;
this.isOdd.next(this.isOddValue);
}
decreaseNumber() {
this.myNumberValue = this.myNumberValue - 1;
this.myNumber.next(this.myNumberValue);
this.isOddValue = !this.isOddValue;
this.isOdd.next(this.isOddValue);
}
}
Теперь в вашем Компоненте все, что вам нужно сделать, это subscribe
до public
значительных Observable
значений из Службы:
import { Component, OnInit, OnDestroy } from '@angular/core';
import { TestService } from '../test.service'
import { Subscription } from 'rxjs';
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.scss']
})
export class TestComponent implements OnInit, OnDestroy {
isOdd: boolean;
subscription: Subscription;
constructor(private testService: TestService) {}
ngOnInit() {
this.subscription = this.testService.isOdd$.subscribe(isOdd => this.isOdd = isOdd);
}
ngOnDestroy() {
this.subscription && this.subscription.unsubscribe();
}
}
Теперь, поскольку у вас subscribe
d до isOdd$
в ngOnInit
, который вызывается во время инициализации компонента, isOdd
в вашем Компоненте будет обновляться каждый раз, когда происходит изменение в isOddValue
в службе.
Также, поскольку это пользовательский subscription
, его следует назначить свойству в Компоненте (subscription
), которое будет иметь тип Subscription
, что мы получаем из метода subscribe
в качестве возвращаемого значения. , Мы должны вызвать unsubscribe
на нем в ngOnDestroy
, чтобы избежать утечек памяти.
PS: Имена свойств и методов в Angular Classes должны быть в lowerCamelCase в соответствии с Styleguide Angular .
Использовать нижний регистр верблюда для именования свойств и методов.