有没有一种方法可以在输入信号的值被设置/更改后立即做出反应,而无需等待 ngAfterViewInit?

问题描述 投票:0回答:1

通常您会使用

effect(() => ...)
对信号变化做出反应。

不幸的是,效果似乎只有在组件完全初始化后才会运行,因此在

ngAfterViewInit
期间/之后运行。

在我们的例子中,一旦设置了输入,我们就必须将组件的输入数据同步到范围服务,并希望在

ngAfterViewInit
内部使用它,这不适用于信号输入。

“经典”

@Input
s 的方式是创建一个在
ngOnChanges
之前/期间运行的 setter。因此,数据在
ngAfterViewInit
期间已经可用。

生命周期顺序:

  • 构造函数

  • 信号输入的变换方法

  • @输入设置器

  • ngOnChanges

  • ngOnInit

  • ngAfterViewInit

  • 执行内联定义的效果(例如

    private signalEffect = effect(() => ...)

  • 执行构造函数定义的效果

到目前为止,我还没有想到比使用effect更好的方法来将信号输入的数据传输到服务。

但是,这只会在 ngAfterViewInit 之后执行。

关于(错误)使用信号的变换方法,感觉完全错误。尽管如此,它将在设置输入时的预期时间执行。然而,这可能会导致我目前无法评估的风险问题,并且对于未来的开发也可能无法理解。

另一方面,使用 @Input setter 是一种经过尝试和测试的变体,可以尽早处理数据。然而,为此偏离信号输入当然很烦人。

我还没有在网上找到关于是否应该以不同方式处理问题的资料。不幸的是,在这方面无法配置效果。

将信号转换为 Observable + Subscribe 不会改变任何内容,因为 toObservable 在底层也使用了效果。

其他人对此有何看法?我应该只依赖“经典”

@Input
+
set
还是有未知的信号方法?

angular signals angular-signals
1个回答
0
投票

正如 @m-g 所评论的,信号处理方式似乎又回到了

ngOnChanges
。它可能只是比输入设置器简洁一点,但不应该对性能产生任何负面影响。

另请参阅https://dev.to/angular/angular-setters-vs-ngonchanges-which-one-is-better-4f2b

因此,除了不推荐的(对于传播数据的用例)

effect
之外,传播信号变化的最终解决方案将如下所示:

myData = input<ValueType>();

ngOnChanges({ myData } : {myData?: SimpleChange & { currentValue: ValueType }}){
  if (myData !== undefined){
    this.service.sync(myData.currentValue)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.