ngOnChanges无法检测数组内容修改时解决方案
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ngOnChanges无法检测数组内容修改时解决方案相关的知识,希望对你有一定的参考价值。
参考技术AngOnChanges是Angular的生命周期钩子, 当数据绑定输入属性的值发生变化时调用。
ngOnChanges()方法获取了一个对象,它可以同时观测1个/多个绑定的属性值,它把每个发生变化的属性名都映射到了一个SimpleChange对象, 该对象中有属性的当前值和前一个值。
假如数据绑定输入属性绑定的数据为一个数组时,数组内容发生改变ngOnChanges是无法监听到的,在这种情况下具体有如下几种解决方案。
1.假如绑定的数组长度每次都发生变化,可以监听数组长度变化从而执行ngOnChanges中的函数。
(坏处:假如数组长度不变,其中某项内容改变无法检测。
2.可以将数组包为一个对象,增加一个key值。(实测无效,即使包成对象依然无法检测到其value中的数组数据改变)
3.将数组包为一个对象,并增加一个key: index,在index中传一个随机数/当前时间戳。(好处在于每次都能触发ngOnChanges,坏处在于这么做可能会消耗性能)
以上三种方法为ngOnChanges无法检测数组内容修改时具体的解决方案,个人比较青睐第三种,毕竟触发比较稳定 o
Vue中无法检测到数组的变动
本周在写项目中遇到修改数组中的值时,视图无变化问题。在查阅Vue官方文档后了解到,由于由JavaScript 的限制,Vue 不能检测以下数组的变动:
- 当利用索引直接设置一个数组项时,例如:
vm.items[indexOfItem] = newValue
- 当修改数组的长度时,例如:
vm.items.length = newLength
例如:
var vm = new Vue({
data: {
items: ['a', 'b', 'c']
}
})
vm.items[1] = 'x' // 不是响应性的
vm.items.length = 2 // 不是响应性的
为了解决第一类问题,以下两种方式都可以实现和vm.items[indexOfItem] = newValue
相同的效果,同时也将在响应式系统内触发状态更新:
// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
也可以使用 vm.$set
实例方法,该方法是全局方法 Vue.set
的一个别名:
vm.$set(vm.items, indexOfItem, newValue)
为了解决第二类问题,也可以使用splice
:
vm.items.splice(newLength)
以上是关于ngOnChanges无法检测数组内容修改时解决方案的主要内容,如果未能解决你的问题,请参考以下文章
Angular ngOnChanges 和变化检测策略似乎是矛盾的?
为啥 Angular 2 ngOnChanges 不响应输入数组推送
为啥 ngOnChange 没有检测到 @Input 元素更改而 ngOnDetect 能够这样做
IONIC2/Angular2 ngOnChange 不起作用