前情提要:项目框架为Angular12.2.16版本,需要实现类似以下功能,调研实现方案决定使用antV/x6图形编辑器
开始使用时发现antV/x6@2.0不兼容Angular14以下版本具体如下图 官网地址:x6.antv.antgroup.com/tutorial/in…
但是Angular12所适配的antV/x6和antv/x6-angular-shape推荐版本为1.38,但是官网现在最新的是1.35,最终参考1.0官网代码没有实现起来,而且antv/x6-angular-shape的包从两年前就停止更新了,考虑到后期维护问题还是使用antV/x6 2.0版本,这里如果有其它好使的插件非常欢迎推荐告知~
官网上说angular14以下需要手动写一些方法来实现在画布上进行子节点的注册,文档上是用Injector就可以挂载上子节点,但是angular14以下需要用到componentFactoryResolver二次封装一个register方法。具体代码实现后期会附上也是参考其他大佬的。
此时画布终于可以渲染出来并且注册挂载子节点了,但是又发现按官网给的传递数据方式,怎么也传不到子节点,也没有任何报错信息,和公司其他前端讨论考虑到是不是因为我们的angular12是基于第三方平台搭建的,我又建了原生的angular12项目安装antV/x6 2.0发现有了报错信息! componentRef.instance.setInput is not a function
发现angular12版本不支持setInput向子节点注入数据,可以用自定义传参代替,终于实现了画布向子节点的数据传递
在开发过程中遇到很多angular原生引擎渲染机制的问题,不同版本的方式也不同耽误了很多时间,还是应该多研究框架底层,有建议和疑问欢迎在评论区讨论,这个功能还在开发中,后期会继续更新。
其实自从画布渲染成功一起问题的解决都是Angular的处理了,由于画布需要和各个组件进行交互,这里的数据节点只有俩个接口,查询和保存,所以在节点上进行处理都需要在前端进行,而且是个庞大的树形结构,这里就用到了Angular的service统一监管,画布的创建都在这里进行,并把treeData保存在这里,已用于所有子节点的使用。
private _treeData = new BehaviorSubject<ModelTree>({} as ModelTree);
tree$ = this._treeData.asObservable();