Angular 角度服务中的布尔值未按预期工作
基本上,我的服务中有一个布尔值Angular 角度服务中的布尔值未按预期工作,angular,typescript,angular-services,Angular,Typescript,Angular Services,基本上,我的服务中有一个布尔值canSiteReload,它基于同一服务中的另一个布尔值hasChanges 该服务如下所示: @Injectable({ providedIn: 'root' }) export class ApplicationService { constructor() { } public hasChanges: boolean = false; public canSiteReload: boolean = this.hasChanges ===
canSiteReload
,它基于同一服务中的另一个布尔值hasChanges
该服务如下所示:
@Injectable({
providedIn: 'root'
})
export class ApplicationService {
constructor() { }
public hasChanges: boolean = false;
public canSiteReload: boolean = this.hasChanges === false;
}
问题是,当我将hasChanges
更改为true时,canSiteReload
仍将返回true,即使this.hasChanges==false
应返回false
,因为hasChanges
现在为true
为什么会发生这种情况?我如何根据hasChanges
生成canSiteReload
的值?如果可能,我希望避免额外的代码,例如没有函数/设置器
复制者:同意@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);
}
我想它正在起作用
分叉:同意@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);
}
我想它正在起作用
分叉:在
ApplicationService
开始时定义了一次canSiteReload
变量,并且该变量不再更新。有多种方法可以满足您的需求。下面是一个使用RxjsBehaviorSubject
的方法
应用服务
从'@angular/core'导入{Injectable};
从“rxjs”导入{BehaviorSubject,Observable};
@注射的({
providedIn:'根'
})
导出类应用程序服务{
private hasChangesSource=新行为主体(false);
private hasChanges$=this.hasChangesSource.asObservable();
公共canSiteReload:布尔值;
构造函数(){
this.hasChanges$.subscribe(状态=>this.canSiteReload=!状态);
}
获取hasChanges(){
返回此.hasChangesSource.value;
}
设置hasChanges(状态:布尔值){
this.hasChangesSource.next(状态);
}
}
我已经修改了您的。在
ApplicationService
开始时定义了一次canSiteReload
变量,并且该变量不再更新。有多种方法可以满足您的需求。下面是一个使用RxjsBehaviorSubject
的方法
应用服务
从'@angular/core'导入{Injectable};
从“rxjs”导入{BehaviorSubject,Observable};
@注射的({
providedIn:'根'
})
导出类应用程序服务{
private hasChangesSource=新行为主体(false);
private hasChanges$=this.hasChangesSource.asObservable();
公共canSiteReload:布尔值;
构造函数(){
this.hasChanges$.subscribe(状态=>this.canSiteReload=!状态);
}
获取hasChanges(){
返回此.hasChangesSource.value;
}
设置hasChanges(状态:布尔值){
this.hasChangesSource.next(状态);
}
}
我已经修改了您的。正如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
现在在每次调用时都进行计算
可以在之后添加附加条件!此.has更改
正如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
现在在每次调用时都进行计算
可以在之后添加附加条件!此.has更改
使用您的代码,
canSiteReload
被初始化,然后其值永远不会被修改。如果您想在另一个变量发生变化时更改canSiteReload,您需要一个方法或getter,正如David所说,或者您可以简单地使用!hasChanges
而不是canSiteReload
@David出于某种原因,我认为canSiteReload
在每次调用时都会被评估,如果事实并非如此,这是非常有意义的。感谢您的帮助。使用您的代码,canSiteReload
将被初始化,然后其值将永远不会被修改。如果您想在另一个变量发生变化时更改canSiteReload,您需要一个方法或getter,正如David所说,或者您可以简单地使用!hasChanges
而不是canSiteReload
@David出于某种原因,我认为canSiteReload
在每次调用时都会被评估,如果事实并非如此,这是非常有意义的。谢谢你的洞察力。