Вы можете переместить функции в одноэлементную службу и отслеживать значение с помощью наблюдаемых. Попробуйте следующее
Общая служба
import { BehaviorSubject, Observable } from 'rxjs'; // <-- included 'Observable' here - with capital 'O'
@Injectable()
export class SharedService {
private addUsuarioSource = new BehaviorSubject<string>('false');
public addUsuario$ = this.addUsuarioSource.asObservable();
constructor() {
this.addUsuario$.subscribe(status => window.localStorage.setItem('addUsuario', status)); // <-- changed 'userStatus' to 'status'
}
getAddUsuario(): Observable<string> { // <-- capital 'O' instead of small 'o'
let userStatus = window.localStorage.getItem('addUsuario');
userStatus = (userStatus === 'false' || userStatus == null) ? 'true' : 'false';
this.addUsuarioSource.next(userStatus);
return this.addUsuario$;
}
}
Компонент Navbar
import { pipe } from 'rxjs';
import { map, take } from 'rxjs/operators';
export class NavbarComponent implements OnInit() {
subscription: any;
ngOnInit() {
if (this.subscription) {
this.subscription.unsubscribe();
}
this.subscription = this.sharedService.getAddUsuario().pipe(take(1)).subscribe(status => {
// this callback will be called only once due to `pipe(take(1))`
// `status` variable with value 'true' or 'false' as string
});
}
}
Другой компонент
this.sharedService.addUsuario$.subscribe(status => {
// this callback will be called each time a new user status is pushed
// `status` variable with value 'true' or 'false' as string
})
Я использую BehaviorSubject
для предоставления значения по умолчанию. Вы можете использовать Rx js Subject
, если вы не используете sh для предоставления значения по умолчанию. Объяснение для pipe(take(1))
можно найти здесь .
Примечание. Хранение логического значения в локальном хранилище не является хорошей идеей. Потому что вы можете хранить только строки, и он возвращает значения в виде строк. Таким образом, вы не можете сделать что-то вроде *ngIf==="status"
или *ngIf==="!status"
. Это будет *ngIf="status === 'true'"
и *ngIf="status === 'false'"
.
Рабочий пример: Stackblitz