ht.Data/ht.Node,都是可以setImage()设置图片的,而一旦图标symbol做了数据绑定,那么变量就自动加到该图元节点的用户数据相当于自动调用了setAttrObject()。
所以,不要对图元对象setAttrObject随意直接赋值,非要这么做也需要先getAttrObject()获取原先的对象值后,针对性字段修改或者添加后的结果,再设置进去,否则会导致原数据被覆盖掉!!
并且注意以下3点:
- 对象的赋值跟json还不一样,对象不论key在不在,都可以obj.newKey = 'newValue',或者obj['newKey'] = 'newValue'这两种方式赋值!
- js对象都是引用类似指针的方式,这里getAttrObject()获取的也是对象引用,所以直接进行赋值追加key-value后就改变了原来对象的内容,无需自己再去调用一下setAttrObject()
- 图元节点用setAttrObject方法设置的用户数据变量比较特殊,会体现在图元在图纸序列化json结构的a属性内,跟图元节点通过setImage设置的图标数据绑定暴露的变量在一块。
针对第3点,补充一下,图标数据绑定暴露的变量除了在图元节点的json结构属性中体现,也会直接体现到编辑器的属性配置界面上,而setAttrObject设置的用户数据变量在编辑器中无法看到对应的属性配置只有看数据json才能看到!
如果代码有对某个图元通过getAttrObject()引用或者直接调用setAttrObject()赋值,那么编辑器中手动修改数据会发现通常无法修改会被自动还原(取决于代码的触发条件),简言之只要调用用户数据赋值,就会影响到json结构序列化,当然其他任何属性的代码赋值都会影响到序列化json内容!
需要重点关注的就是设置用户数据后,会即时影响到图纸序列化的json内容,当不保存图纸时,那么新增加的用户数据,每次都是程序运行到设置attrObject的时候才会运行时动态追加!
如果ctrl+s保存了图纸,那么追加的这个用户数据就会被永久json序列化,从而导致初始化加载图纸的时候有了初始值!至于这个初始值是否会造成影响,就要看前后文代码逻辑,可能会出现非常诡异的问题,运行好好的,只要保存、重新加载就会报错之类!
一般情况下程序想通过setAttrObject给图元设置用户数据属性变量,是程序运行时需要,只在内存中,但是如果该代码在编辑器编辑状态也会被执行到,那么会导致编辑状态一旦保存图纸,那么会把本来内存中动态设置的数据,被永久序列化到json文件中了!