随着最近的Angular更新(我们正在使用v.17),我们开始在我们的应用程序中使用Angular信号.有一个问题是我们遇到的,我们不知道如何妥善处理.
我们的组件收到FormControl
作为@Input
.我们调整了代码以适应新的输入信号
public readonly control = input<FormControl | null>(null)
现在我们希望有valueChanges
或statusChanges
作为一个信号,但我们不知道如何.
这不是被动的:
public readonly value = toSignal(this.control().valueChanges);
这是不允许的:
public readonly value = computed(() => toSignal(this.control().valueChanges));
将value
作为一个信号可以帮助以更复杂的计算方式使用它.例如
public readonly complexCondition = computed(() => this.value() == // some complex checks
然后使用模板中的信号.
如果没有这一点,我们将需要一个getter或一个方法,这将不适用于OnPush
-Strategy(我认为?)或者每个周期都会执行,导致不必要的调用,因为值可能只是保持不变.
还防止从效果手动设置信号.我们可以把它变成一个效果,设置一个基本变量,可能像这样:
effect(() => {
this.control()?.valueChanges.subscribe(val => {
this.complexCondition = this.value() == // some complex checks
})
});
但这看起来确实有点笨拙,我认为也不适合OnPush
-战略
Question: 如何组织此类案件?
我试图在Angular文档或博客中找到任何东西,但我发现了类似的问题.我想我可能在错误的轨道上在这里,但期待看到正确的方式来做到这一点.
EDIT
我继续阅读这个主题,我认为真正能解决我的问题的是角形式提供信号.或者,我们必须将formControl包装在我们自己的类中,并提供自己的信号逻辑,但不使用toSignal(对于valueChanges和statusChanges很方便),因为这不能在注入上下文之外使用.
有这个开放功能请求:https://github.com/angular/angular/issues/53485
据我所知,这是Angular团队正在努力的事情.在那之前,人们可以使用这个包:https://github.com/timdeschryver/ng-signal-forms
这对我们来说不是一个选项,因为切换到这个包将意味着很多更改.但也许这对其他人有帮助.