|
11,记录一个到目前为止耗时最长的问题
我在window对象上挂了个对象,代码:window.oldData=JSON.parse(JSON.stringify(viewModel.getAllData()));这个oldData设计是深拷贝,只读,但后期发现oldData中的某个属性值变了(注是某个属性,不是整个oldData,这是最容易误导人的地方),一再确认不是自己误操作后寻求用友帮助好几次,但都没发现问题。因为是某个属性值变了,所以一开始我陷入了误区,去找这个属性值是在哪句代码后变的,最后锁定updateRow函数,但这是系统方法,于是还看了下源码…………但,这是误区!!!
后来用友的韩老师把问题锁定在对象引用上,这算是成功的第一步,跳出了前面的误区,接下来是找出引用在哪里更改,韩老师提供一个方法,Object.defineProperty去追踪,但韩老师认为是oldData被更改,所以一直无果……
后来我想,既然是引用问题,那么如果两个变量指向同一地址,那么任何一个变更都会导致最终值的变更。所以我去找哪里引用了oldData的属性值,最终确定在setData这个方法。
这个方法会遍历属性,然后赋值,但对于子表,是直接给rows属性赋值,而rows是引用,和oldData子表数据是同一地址,这就是问题所在!!!同样的setDatasource也存在这个问题!
所以如果你这样赋值给子表,viewModel.getGridModel().setDataSource(Data);Data变,子表模型数据也变,但UI并不会刷新,反过来子表数据改变,Data也会变!
所以较好的方法是,viewModel.getGridModel().setDataSource(JSON.parse(JSON.stringify(Data)))
|
|