使用angular.copy复制对象数组时isChecked属性丢失求助
解决AngularJS
angular.copy复制数组丢失自定义属性的问题 嘿,这个问题我之前也踩过坑!核心原因是**angular.copy在处理数组类型时,只会复制数组的索引元素,不会保留直接挂载在数组对象本身上的自定义属性**——你这里的TransformationRoadMap本质是一个数组,同时给它附加了isChecked属性,这就刚好触发了这个问题。
为什么会出现这种差异?
AngularJS的angular.copy对数组的处理逻辑是:创建一个新的空数组,然后遍历原数组的索引元素(也就是[0]、[1]、[2]这些),把每个元素深拷贝后放进新数组里。但那些直接加在数组对象上的额外属性(比如你的isChecked),不在数组的索引元素范围内,所以不会被复制。
而ValueTouchPoints没问题,是因为它本身就是一个普通对象,isChecked是这个对象的直接属性,angular.copy处理普通对象时会复制所有可枚举属性,所以自然保留了下来。
两种实用解决方案
方案1:把数组包装成对象(推荐)
最稳妥的方式是调整数据结构,把数组和它的自定义属性放在一个对象里,这样angular.copy就能完整复制所有内容:
// 修改原数据结构,将数组包装成包含items和isChecked的对象 var name = { TransformationRoadMap: { items: [{}, {}, {}], // 原数组元素 isChecked: true }, ValueTouchPoints: { ValueTouchPoints: [{}, {}, {}], ValueTouchPointsLink: [{}, {}, {}, {}, {}], isChecked: true } }; // 现在复制就不会丢失属性了 var collectionFlyoutObject = angular.copy(name);
方案2:手动复制自定义属性
如果不想修改原数据结构,可以在angular.copy之后,手动把原数组上的自定义属性赋值给新数组:
var collectionFlyoutObject = angular.copy(name); // 手动复制数组上的isChecked属性 collectionFlyoutObject.TransformationRoadMap.isChecked = name.TransformationRoadMap.isChecked; // 如果还有其他自定义属性,也需要逐一手动复制
这样就能解决你遇到的数组属性丢失问题啦!
内容的提问来源于stack exchange,提问作者Sudhir MN
相关产品推荐
相关产品推荐

