个人理解TextProp,TextField,FieldAp,TextEdit之间关系原创
金蝶云社区-吴锐雄
吴锐雄
6人赞赏了该文章 687次浏览 未经作者许可,禁止转载编辑于2024年09月19日 19:48:18


开发了一段时间的动态添加控件,对苍穹的控件、模型有了一些理解。写个文章作为记录。


动态添加控件参考文章:

https://vip.kingdee.com/link/s/lHvZv


以下是一些个人理解:

TextProp对应 数据模型字段,需要在getEntityType()事件中添加数据模型,这样model里面才会有这个字段。如果没有向model里面设置数据模型,那么调用getModel().setValue(),对字段设置值,会失败。

TextField对应 字段类型,TextField就是对应了文本类型,可以看到源码中是这样写的:TextField extends Field<TextProp>

FieldAp对应 控件的设计期,是所有的字段控件(文本、整数、日期等控件)的设计期
  • FieldAp里面可以包裹字段类型,例如包裹一个文本字段fieldAp.setField(textField)。这样,FieldAp就可以看作是文本控件的设计期。
  • FieldAp调用createRuntimeControl()可以创建一个运行期的控件对象FieldEdit,可以在onGetControl()事件中,将创建出来的控件对象作为返回值。
  • FieldAp调用createControl()可以创建一个map表,这map表里面有构成这个控件所需的一些信息,可以在loadCustomControlMetas()事件中返回给前端。

TextEdit对应 控件的运行期,如果FieldAp设置的是字段类型是TextField,在FieldAp调用createRuntimeControl()的时候,会直接调用到TextField的createServerEditor()方法,可以看到里面创建的是TextEdit对象,而TextEdit正是继承了上面的FieldEdit。

image.png

image.png


控件、模型都创建完了,那beforeBindData()事件有什么用处?

TextEdit的父类Control,有一个view对象(其实就是苍穹运行期的视图对象),这个对象现在还是空的,我们可以在beforeBindData()事件中给控件设置视图对象。

TextEdit textEdit = getControl(KEY_AUTOTEXT1);
textEdit.setView(getView());

也可以从容器控件中,取出全部子控件,丢给view,让view去完成设置:

Container myFldPanel = this.getView().getControl(KEY_MYFIELDCONTAINER);
getView().createControlIndex(myFldPanel.getItems());

image.png


赞 6