Angular运行时点击按钮向对象添加数据不生效的修复方法
问题原因
组件初始化时,data数组中id=4的names条目下的data字段,存的是初始化阶段this.newData指向的空数组的内存引用。
你在add()方法里执行this.newData = [xxx]的操作,本质是把组件类上的newData属性重新指向了一个全新的数组,既没有修改data里names条目原本持有的那个空数组,也没有更新data对象本身的内容,Angular的变更检测捕获不到模板绑定的data变量有任何变化,自然不会刷新视图,整个过程没有语法错误,所以控制台也不会报任何错。
修复方法
两种实现都可以,按需选择:
方法1:直接更新绑定的data对象(最稳妥,兼容OnPush变更检测策略)
不需要依赖newData变量做中转,点击按钮时直接找到data里对应的names条目,更新它的data属性即可:
add() { const targetItem = this.data.find(item => item.id === 4); if (targetItem) { targetItem.data = [ { description: 'Tom' }, { description: 'Paul' }, { description: 'Frank' } ]; } }
因为直接修改了模板绑定的data对象的属性,变更检测可以直接捕获到变化,点击后视图会立即更新。
方法2:保留原有newData的数组引用,不做重新赋值
如果你需要保留newData这个中间变量,就不要在add()方法里给它重新赋值新数组,而是在原有数组的基础上修改内容:
add() { // 清空原有数组内容,不替换引用 this.newData.length = 0; // 追加新数据 this.newData.push( { description: 'Tom' }, { description: 'Paul' }, { description: 'Frank' } ); }
由于data里names条目的data字段始终持有newData初始数组的引用,你修改这个数组的内容时,变更检测能识别到数组变动,视图也会正常渲染新数据。
提示:如果你的组件使用了
ChangeDetectionStrategy.OnPush变更检测策略,优先选方法1,通过更新对象引用触发变更,不需要额外手动调用检测方法。
内容的提问来源于stack exchange,提问作者zaknio55
相关产品推荐
相关产品推荐

