ngOnChanges无法检测数组内容修改时解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ngOnChanges无法检测数组内容修改时解决方案相关的知识,希望对你有一定的参考价值。

参考技术A

ngOnChanges是Angular的生命周期钩子, 当数据绑定输入属性的值发生变化时调用。

ngOnChanges()方法获取了一个对象,它可以同时观测1个/多个绑定的属性值,它把每个发生变化的属性名都映射到了一个SimpleChange对象, 该对象中有属性的当前值和前一个值。

假如数据绑定输入属性绑定的数据为一个数组时,数组内容发生改变ngOnChanges是无法监听到的,在这种情况下具体有如下几种解决方案。

1.假如绑定的数组长度每次都发生变化,可以监听数组长度变化从而执行ngOnChanges中的函数。
(坏处:假如数组长度不变,其中某项内容改变无法检测。

2.可以将数组包为一个对象,增加一个key值。(实测无效,即使包成对象依然无法检测到其value中的数组数据改变)

3.将数组包为一个对象,并增加一个key: index,在index中传一个随机数/当前时间戳。(好处在于每次都能触发ngOnChanges,坏处在于这么做可能会消耗性能)

以上三种方法为ngOnChanges无法检测数组内容修改时具体的解决方案,个人比较青睐第三种,毕竟触发比较稳定 o

Vue中无法检测到数组的变动

本周在写项目中遇到修改数组中的值时,视图无变化问题。在查阅Vue官方文档后了解到,由于由JavaScript 的限制,Vue 不能检测以下数组的变动:
  1. 当利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
  2. 当修改数组的长度时,例如: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 不起作用

在 Angular 4 中,钩子 ngOnChanges 不会在输入时触发

从 Angular 中的 @Input 更新 ngOnChanges 视图