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
变量,并且该变量不再更新。有多种方法可以满足您的需求。下面是一个使用Rxjs
BehaviorSubject
的方法

应用服务

从'@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
变量,并且该变量不再更新。有多种方法可以满足您的需求。下面是一个使用Rxjs
BehaviorSubject
的方法

应用服务

从'@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
在每次调用时都会被评估,如果事实并非如此,这是非常有意义的。谢谢你的洞察力。