Angular 中的布尔值服务未按预期工作
Boolean in Angular Service is not working as expected
基本上,我的服务中有一个布尔值 canSiteReload
,它基于同一服务中的另一个布尔值 hasChanges
。
服务如下所示:
@Injectable({
providedIn: 'root'
})
export class ApplicationService {
constructor() { }
public hasChanges: boolean = false;
public canSiteReload: boolean = this.hasChanges === false;
}
问题是,当我将 hasChanges
更改为 true 时,canSiteReload
仍将 return 为 true,即使 this.hasChanges === false
应该 return false
因为 hasChanges
现在为真。
为什么会这样,我如何根据 hasChanges
计算 canSiteReload
的值?如果可能的话,我想避免额外的代码,例如没有 functions/setters.
同意@David 的评论。没有写函数,canSiteReload
好像没有更新。
我分叉并更改了以下部分:
this.appService.hasChanges = false;
我在服务中创建了一个函数,并使用该函数更新了值。像这样:
public change(): void{
this.appService.saveChanges(true);
console.log('Has changes?: ', this.appService.hasChanges);
console.log('Can site reload?: ', this.appService.canSiteReload);
}
public undo(): void{
this.appService.saveChanges(false);
console.log('Has changes?: ', this.appService.hasChanges);
console.log('Can site reload?: ', this.appService.canSiteReload);
}
我认为它正在工作。
canSiteReload
变量在 ApplicationService
的开头定义一次,并且永远不会再次更新。有多种方法可以满足您的要求。这是使用 Rxjs BehaviorSubject
.
的一种方法
应用服务
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ApplicationService {
private hasChangesSource = new BehaviorSubject<boolean>(false);
private hasChanges$ = this.hasChangesSource.asObservable();
public canSiteReload: boolean;
constructor() {
this.hasChanges$.subscribe(status => this.canSiteReload = !status);
}
get hasChanges() {
return this.hasChangesSource.value;
}
set hasChanges(status: boolean) {
this.hasChangesSource.next(status);
}
}
我修改了你的Stackblitz。
正如 David 所说,canSiteReload
已初始化但其值从未更新。
canSiteReload
不更新,即使 hasChanges
的值已更新为 true
。
要修复,我们需要为 canSiteReload
添加一个 getter:
@Injectable({
providedIn: 'root'
})
export class ApplicationService {
constructor() { }
public hasChanges: boolean = false;
public get canSiteReload(): boolean{
return !this.hasChanges
}
}
canSiteReload
现在每次调用时都会计算。
可以在!this.hasChanges
后添加附加条件。
基本上,我的服务中有一个布尔值 canSiteReload
,它基于同一服务中的另一个布尔值 hasChanges
。
服务如下所示:
@Injectable({
providedIn: 'root'
})
export class ApplicationService {
constructor() { }
public hasChanges: boolean = false;
public canSiteReload: boolean = this.hasChanges === false;
}
问题是,当我将 hasChanges
更改为 true 时,canSiteReload
仍将 return 为 true,即使 this.hasChanges === false
应该 return false
因为 hasChanges
现在为真。
为什么会这样,我如何根据 hasChanges
计算 canSiteReload
的值?如果可能的话,我想避免额外的代码,例如没有 functions/setters.
同意@David 的评论。没有写函数,canSiteReload
好像没有更新。
我分叉并更改了以下部分:
this.appService.hasChanges = false;
我在服务中创建了一个函数,并使用该函数更新了值。像这样:
public change(): void{
this.appService.saveChanges(true);
console.log('Has changes?: ', this.appService.hasChanges);
console.log('Can site reload?: ', this.appService.canSiteReload);
}
public undo(): void{
this.appService.saveChanges(false);
console.log('Has changes?: ', this.appService.hasChanges);
console.log('Can site reload?: ', this.appService.canSiteReload);
}
我认为它正在工作。
canSiteReload
变量在 ApplicationService
的开头定义一次,并且永远不会再次更新。有多种方法可以满足您的要求。这是使用 Rxjs BehaviorSubject
.
应用服务
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ApplicationService {
private hasChangesSource = new BehaviorSubject<boolean>(false);
private hasChanges$ = this.hasChangesSource.asObservable();
public canSiteReload: boolean;
constructor() {
this.hasChanges$.subscribe(status => this.canSiteReload = !status);
}
get hasChanges() {
return this.hasChangesSource.value;
}
set hasChanges(status: boolean) {
this.hasChangesSource.next(status);
}
}
我修改了你的Stackblitz。
正如 David 所说,canSiteReload
已初始化但其值从未更新。
canSiteReload
不更新,即使 hasChanges
的值已更新为 true
。
要修复,我们需要为 canSiteReload
添加一个 getter:
@Injectable({
providedIn: 'root'
})
export class ApplicationService {
constructor() { }
public hasChanges: boolean = false;
public get canSiteReload(): boolean{
return !this.hasChanges
}
}
canSiteReload
现在每次调用时都会计算。
可以在!this.hasChanges
后添加附加条件。