Angular 函数在ngOnInit中只传递一次

Angular 函数在ngOnInit中只传递一次,angular,typescript,Angular,Typescript,我开发了一项服务,允许我激活一个按钮,并在不同的组件中查看其状态。 单击“开始/暂停”时,该按钮会更改图像 在StackBlitz中,代码工作得很好,但当我在项目中实现它时,函数只在ngOnInit中传递一次,不再加载,不再改变组件之间按钮的图像 有没有一种方法可以实现这一点,但不使用ngOnInit 我使用了setinterval,按钮改变了图像,但这似乎不是最好的解决方案 有人能帮我吗 关于组件的问题 html ngOnInit是一个licefycle挂钩,始终只运行一次。如果您想在每次值更

我开发了一项服务,允许我激活一个按钮,并在不同的组件中查看其状态。 单击“开始/暂停”时,该按钮会更改图像

在StackBlitz中,代码工作得很好,但当我在项目中实现它时,函数只在ngOnInit中传递一次,不再加载,不再改变组件之间按钮的图像

有没有一种方法可以实现这一点,但不使用ngOnInit

我使用了setinterval,按钮改变了图像,但这似乎不是最好的解决方案

有人能帮我吗

关于组件的问题

html

ngOnInit是一个licefycle挂钩,始终只运行一次。如果您想在每次值更改时执行某些操作,则需要一个不同的钩子。在你的情况下,可能是ngOnChanges

每次组件绑定值更改时,都会调用此函数


有关不同挂钩的更多信息,我建议:

您可以将服务定义为公共服务

constructor(public servicesService: ServicesService) { }
在你的html中

*ngIf="servicesService.getCurrentState()=='pause'" 
组成部分

HTML


组件生命周期中的Ngonit只运行一次。如果您不想多次运行某些内容,则需要使用setInterval等。如果您需要运行一次,但在视图初始化之后,则可以尝试ngAfterViewInitHello!实际上,您需要在不同的组件中使用状态,我不打算回答您的问题,但我想让您看看。如果您计划在多个组件中使用不同的状态,NGRX可能是一个很好的选择:如果您不知道NGRX,您应该阅读一个博客,如果您仍然想使用此服务模式,我建议您在*ngIf中获得当前状态,如下所示:*ngIf=this.servicesService.getCurrentState=='pause'谢谢您的帮助,顺致敬意,好吧,虽然在同一个组件中使用该服务不必是公共的。@lama,你能解释一下为什么吗?我想知道你为什么这么认为。对不起,虽然它可以与JIT编译器一起工作,但与AOT不同@“阿索塔列克萨尼亚是对的,我错了。”喇嘛,如果我正确理解你说的话。我已经用过很多次了,并且用-AOT编译了这个项目,一切都正常。如果你注入了一个私有服务,它不会用AOT工作,但正如你建议的那样。private只要使用JIT编译器就可以工作。这就是我的意思。下面是一个讨论:
 startTimer() {
    this.servicesService.startTimer();
    this.currentState = this.servicesService.getCurrentState();
 }

 pauseTimer() {
    this.servicesService.pauseTimer();
    this.currentState = this.servicesService.getCurrentState();
 }
constructor(public servicesService: ServicesService) { }
*ngIf="servicesService.getCurrentState()=='pause'" 
constructor(private servicesService: ServicesService) {}

public get isPlaying() {
   return this.servicesService.getCurrentState() === 'play';
}

public get isPaused() {
   return this.servicesService.getCurrentState() === 'pause'
}
*ngIf="isPlaying" 
*ngIf="isPaused"