3 回答
TA贡献1998条经验 获得超6个赞
rawLapsData
继续指向同一个数组,即使您修改了数组的内容(例如,添加项目,删除项目,更改项目)。
在更改检测期间,当Angular检查组件的输入属性以进行更改时,它(基本上)===
使用脏检查。对于数组,这意味着对数组引用(仅)进行脏检查。由于rawLapsData
数组引用没有改变,ngOnChanges()
因此不会被调用。
我可以想到两种可能的解决方案:
实现
ngDoCheck()
并执行您自己的更改检测逻辑,以确定数组内容是否已更改。(Lifecycle Hooks doc有一个例子。)rawLapsData
每当您对数组内容进行任何更改时,都会分配一个新数组。然后ngOnChanges()
将调用因为数组(引用)将显示为更改。
在你的回答中,你提出了另一个解决方案。
在OP上重复一些评论:
我仍然没有看到如何
laps
能够接受改变(当然它必须使用与ngOnChanges()
自身相当的东西?)而map
不能。
在
laps
组件中,您的代码/模板遍历lapsData
数组中的每个条目,并显示内容,因此在显示的每个数据上都有Angular绑定。即使Angular没有检测到组件输入属性的任何更改(使用
===
检查),它仍然(默认情况下)脏检查所有模板绑定。当其中任何一个发生变化时,Angular将更新DOM。这就是你所看到的。该
maps
组件可能在其模板中没有任何绑定到其lapsData
输入属性,对吧?这可以解释不同之处。
请注意,lapsData
在组件和rawLapsData
父组件中都指向相同/一个数组。因此,即使Angular没有注意到对lapsData
输入属性的任何(引用)更改,组件“get”/看到任何数组内容更改,因为它们共享/引用该一个数组。我们不需要Angular来传播这些更改,就像我们使用基本类型(字符串,数字,布尔值)一样。但是对于原始类型,对值的任何更改都将始终触发ngOnChanges()
- 这是您在答案/解决方案中利用的内容。
正如您可能已经想到的那样,对象输入属性与数组输入属性具有相同的行为。
TA贡献2021条经验 获得超8个赞
不是最干净的方法,但每次更改值时都可以克隆对象?
rawLapsData = Object.assign({}, rawLapsData);
我想我更喜欢这种方法而不是实现你自己的方法,ngDoCheck()
但也许像@GünterZöchbauer这样的人可能会参与其中。
TA贡献1864条经验 获得超2个赞
作为Mark Rajcok第二个解决方案的延伸
每当对数组内容进行任何更改时,都会为rawLapsData分配一个新数组。然后将调用ngOnChanges(),因为数组(引用)将显示为更改
您可以像这样克隆数组的内容:
rawLapsData = rawLapsData.slice(0);
我提到这个是因为
rawLapsData = Object.assign({},rawLapsData);
不适合我。我希望这有帮助。
- 3 回答
- 0 关注
- 1910 浏览
添加回答
举报