通常您会使用
effect(() => ...)
对信号变化做出反应。
不幸的是,效果似乎只有在组件完全初始化后才会运行,因此在
ngAfterViewInit
期间/之后运行。
在我们的例子中,一旦设置了输入,我们就必须将组件的输入数据同步到范围服务,并希望在
ngAfterViewInit
内部使用它,这不适用于信号输入。
“经典”
@Input
s 的方式是创建一个在 ngOnChanges
之前/期间运行的 setter。因此,数据在ngAfterViewInit
期间已经可用。
生命周期顺序:
构造函数
信号输入的变换方法
@输入设置器
ngOnChanges
ngOnInit
ngAfterViewInit
执行内联定义的效果(例如
private signalEffect = effect(() => ...)
)
执行构造函数定义的效果
到目前为止,我还没有想到比使用effect更好的方法来将信号输入的数据传输到服务。
但是,这只会在 ngAfterViewInit 之后执行。
关于(错误)使用信号的变换方法,感觉完全错误。尽管如此,它将在设置输入时的预期时间执行。然而,这可能会导致我目前无法评估的风险问题,并且对于未来的开发也可能无法理解。
另一方面,使用 @Input setter 是一种经过尝试和测试的变体,可以尽早处理数据。然而,为此偏离信号输入当然很烦人。
我还没有在网上找到关于是否应该以不同方式处理问题的资料。不幸的是,在这方面无法配置效果。
将信号转换为 Observable + Subscribe 不会改变任何内容,因为 toObservable 在底层也使用了效果。
其他人对此有何看法?我应该只依赖“经典”
@Input
+ set
还是有未知的信号方法?
正如 @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)
}
}