Angular信号需为信号对象还是内部原始值?变更检测策略咨询
Angular v14中Signal与变更检测的问题
场景重现
我在Angular v14中定义了以下对象:
objA: {name: string, value: number}, objB: {name: string, value: number}
以及包含这两个对象的列表:
ObjList = [objA, objB]
在模板中通过*ngFor遍历该列表:
<table *ngFor="let obj of ObjList; let i = index "> <input [(ngModel)]='obj.name' (keyup)='keyup(obj)' > <input [(ngModel)]='obj.value' (keyup)='keyup(obj)' > </table>
上述代码实现了原始值的双向绑定,并为每个对象绑定了对应的keyup函数。这些属性为可变属性,修改会引发对象属性间的变化。我不清楚在新的变更检测机制下,以下哪种方式能实现正确的变更检测:
- A) 对象和属性均转为Signal;
- B) 仅将对象转为Signal;
- C) 仅将属性转为Signal?
同时想咨询:Angular Signal需要是Signal对象还是内部的原始值?
问题解答
变更检测方式选择
正确选项是A) 对象和属性均转为Signal,原因如下:
- 若仅将对象转为Signal(选项B),修改对象内部的
name或value属性时,Signal的引用并未发生变化,Angular的Signal变更检测无法感知内部属性修改,无法触发视图更新。 - 若仅将属性转为Signal(选项C),列表
ObjList仍是普通数组,当数组内对象被替换或数组长度变化时,普通数组的变更无法被Signal的变更检测机制精准捕获,易出现视图不同步问题。 - 当对象和属性都转为Signal后,既可以检测数组的结构变化,每个对象内部属性的修改也会通过Signal的通知机制触发变更检测,确保视图与数据实时同步,完全适配Angular的新变更检测逻辑。
Signal的本质要求
Angular Signal必须是Signal对象,而非内部的原始值。Signal是Angular提供的响应式包装器,通过signal()创建、set()/update()修改值,只有这种包装后的对象才能触发Angular的响应式变更检测。直接使用原始值会失去Signal的响应式能力,无法利用其精准变更检测的特性。
内容的提问来源于stack exchange,提问作者Juergen Gross
相关产品推荐
相关产品推荐

