angular - 在不重新创建整个对象的情况下更改对象数组的属性值
问题描述
如何在不重新创建整个对象的情况下更改对象数组中的单个元素?
我有一个像这样的对象数组
objArr = [{
icon: 'add',
iconAdd: 'add',
iconRemove: 'remove',
expand: false
},
{
icon: 'add',
iconAdd: 'add',
iconRemove: 'remove',
expand: false
}]
我的函数获取单击元素的 ID,然后我想更新该索引的展开元素。
updateObjArr(index) {
this.objArr[index].expand = !this.objArr[index].expand
}
但是,这会更新数组中的所有展开值。当我真的只想更新指定的索引时。
我尝试将当前索引对象分配给临时变量,然后以这种方式更改它,但会出现同样的问题。
let tempItemHolder = this.objArr[index];
tempItemHolder.expand = !tempItemHolder.expand;
this.objArr[index] = tempItemHolder;
我发现唯一有效的是创建整个对象
updateObjArr(index) {
this.objArr[index] = {
icon: 'add',
iconAdd: 'add',
iconRemove: 'remove',
expand: true
}
}
但是当我只想更改一个值时,这似乎是不必要的,iconAdd 和 iconRemove 总是保持不变。
还有其他方法吗?或者这就是 Typescript 对象的工作方式?
编辑
错误很可能是我如何设置的结果。这是一个遍历我的内容的 NgFor 循环,因为我正在尝试构建 Accordion 列表(不创建额外的组件)。
OnClick,我为该元素传入索引 I 并更新展开状态。我刚刚更新了整个索引块,它工作正常,有人可以关闭这个问题吗?
解决方案
似乎必须有更多的事情发生,因为this.objArr[index].expand = !this.objArr[index].expand
只会更新指定索引处的对象。我怀疑您在创建数组时重复使用相同的对象,或者更新函数被每个索引调用。
当我说使用相同的对象时,我的意思是:
let newObj = {
icon: 'add',
iconAdd: 'add',
iconRemove: 'remove',
expand: false
};
let objArray = [newObj, newObj, newObj];
在那种情况下,数组的每个元素都是对同一个对象的引用,因此更改一个值似乎会改变它们。
推荐阅读
- javascript - 如何在 React Native 中使用 FlatList 显示数据?
- postgresql - postgresql:删除表中的行,通过外键匹配另一个表中的值
- c# - 从外部样式资源中查找元素,然后更改自己的样式
- css - 使用 *ngIf Angular 6 进行条件渲染
- jsp - 使用 JSP 文件时在哪里实例化“请求”对象?
- git - Jenkins - 在构建时创建 Git 分支
- asp.net - Asp.Net 4.7 中默认未启用 TLS 1.2
- limit - 将大量电子邮件复制到 SharePoint 时的harmon.ie 限制
- c# - 将选定的行从一个 GridView 传输到 webform (ASP.NET) 中的另一个 GridView
- logging - Jboss 7 存储日志文件