电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

loadCustomControlMetas事件

来源:金蝶云社区作者:金蝶2024-09-234

loadCustomControlMetas事件

1 事件简介

插件可以在loadCustomControlMetas事件修改显示参数,向前端动态增加控件。


2 事件触发时机

显示界面前,构建界面显示参数时,触发此事件。

 

特别说明:

  • 动态添加控件时,还需要同步处理onGetControl事件,向表单添加控件编程模型实例,并侦听控件的插件事件;

  • 动态增加字段,则还需要同步处理getEntityType, createNewData, beforeBindData事件,调整后台数据模型及数据包。

 

需同步处理的事件:

  • public void loadCustomControlMetas(LoadCustomControlMetasArgs e) :向前端浏览器界面输出动态控件的元数据;

  • public void onGetControl(OnGetControlArgs e):向后台视图模型,输出动态控件的编程模型实例,并侦听控件的事件;

  • public void getEntityType(GetEntityTypeEventArgs e):向界面主实体模型,动态注册新的属性对象,存储动态添加的字段值;

  • public void createNewData(BizDataEventArgs e):基于修改后的实体模型,创建界面数据包,包含动态添加的字段值;

  • public void beforeBindData(EventObject e):向后台视图模型,添加动态字段的控件编辑模型;随后,系统将基于这些新添加的字段编辑模型(FieldEdit),进行数据绑定。如果不处理这个事件,动态添加的字段值,显示不出来。

 

3 代码模板

package   kd.bos.plugin.sample.dynamicform.pcform.form.template;
 
import   java.util.EventObject;
 
import   kd.bos.entity.datamodel.events.BizDataEventArgs;
import   kd.bos.entity.datamodel.events.GetEntityTypeEventArgs;
import   kd.bos.form.events.LoadCustomControlMetasArgs;
import   kd.bos.form.plugin.AbstractFormPlugin;
 
public class LoadCustomControlMetas extends AbstractFormPlugin {
 
    @Override
    public void loadCustomControlMetas(LoadCustomControlMetasArgs   e) {
         super.loadCustomControlMetas(e);
         // TODO 在此修改显示参数,向前端动态添加控件配置
    }
 
    @Override
    public void getEntityType(GetEntityTypeEventArgs e) {
         // TODO 在此修改实体模型,增加属性
    }
 
    @Override
    public void createNewData(BizDataEventArgs e) {
         // TODO 在此基于调整后的实体模型,创建界面数据包
    }
   
    @Override
    public void beforeBindData(EventObject e) {
         // TODO 在此向界面编程模型,动态添加字段编程模型(FieldEdit)
    }
 
    @Override
    public void onGetControl(OnGetControlArgs e) {
         // TODO 在此创建动态控件的实例,并捕获控件事件
    }
}


4 参数说明 

LoadCustomControlMetasArgs e

  • Object getSource():FormShowParameter,显示参数对象,包含了待显示界面的标识;

  • List<Map<String, Object>> getItems(): 动态添加到前端的控件配置集合。

 

5 应用示例

5.1案例说明

1.在界面加载时,向界面添加字段与控件:

   a. 向单据头添加一个新的文本字段autotext1,字段值由插件填写;

   b. 向单据体添加一个新的文本字段autotext2,字段值由插件填写;

   c. 添加一个新的按钮 autobutton1。


2. 用户点击动态添加的按钮时,显示提示信息。


5.2 实现方案


1. 在界面上,增加一个容器面板:myfieldcontainer,作为容器,包含自动添加的字段、控件;

2. 捕获 loadCustomControlMetas 事件,向容器控件添加新的字段、控件;

3. 捕获 getEntityType 事件,向主实体,注册添加的文本属性;

4. 捕获 createNewData 事件,自行构建界面数据包;

5. 捕获 beforeBindData 事件,输出自定义字段值到前端界面;

6. 捕获 onGetControl 事件,输出动态添加的字段、按钮的控件编程模型;

7. 捕获 click 事件,响应动态按钮的点击事件。

 

5.3 运行效果

  • 界面加载动态添加的文本字段和按钮。


 

  • 点击动态添加的按钮,弹出的提示信息。


 

5.4 实例代码

package   kd.bos.plugin.sample.dynamicform.pcform.form.bizcase;
 
import   java.util.EventObject;
import   java.util.HashMap;
import   java.util.List;
import   java.util.Map;
 
import   kd.bos.dataentity.entity.DynamicObject;
import   kd.bos.dataentity.entity.DynamicObjectCollection;
import   kd.bos.dataentity.entity.LocaleString;
import   kd.bos.dataentity.utils.StringUtils;
import   kd.bos.entity.EntryType;
import   kd.bos.entity.MainEntityType;
import   kd.bos.entity.datamodel.events.BizDataEventArgs;
import   kd.bos.entity.datamodel.events.GetEntityTypeEventArgs;
import   kd.bos.entity.property.TextProp;
import   kd.bos.exception.ErrorCode;
import   kd.bos.exception.KDException;
import   kd.bos.form.ClientProperties;
import   kd.bos.form.container.Container;
import   kd.bos.form.control.Button;
import   kd.bos.form.control.Control;
import   kd.bos.form.control.EntryGrid;
import   kd.bos.form.control.events.ClickListener;
import   kd.bos.form.events.LoadCustomControlMetasArgs;
import   kd.bos.form.events.OnGetControlArgs;
import   kd.bos.form.field.TextEdit;
import   kd.bos.form.plugin.AbstractFormPlugin;
import   kd.bos.metadata.entity.commonfield.TextField;
import   kd.bos.metadata.form.container.FlexPanelAp;
import   kd.bos.metadata.form.control.ButtonAp;
import   kd.bos.metadata.form.control.EntryAp;
import   kd.bos.metadata.form.control.EntryFieldAp;
import   kd.bos.metadata.form.control.FieldAp;
 
public class LoadCustomControlMetasSample extends AbstractFormPlugin implements ClickListener {
   
    private final static String KEY_ENTRYENTITY = "entryentity";
    private final static String KEY_MYFIELDCONTAINER = "myfieldcontainer";
    private final static String KEY_AUTOTEXT1 = "autotext1";
    private final static String KEY_AUTOTEXT2 = "autotext2";
    private final static String KEY_AUTOBUTTON1 = "autobutton1";
   
    /**
     * 界面显示前,触发此事件:向前端界面输出动态添加的字段、控件
     * @remark
     * 这个事件只能向前端界面添加字段、控件;后台的视图模型、数据模型,均没有改变
     */
    @Override
    public void   loadCustomControlMetas(LoadCustomControlMetasArgs e) {
         super.loadCustomControlMetas(e);
        
         // 动态添加单据头字段、按钮
         FlexPanelAp headAp = this.createDynamicPanel();
         Map<String, Object> mapHead = new HashMap<>();
         mapHead.put(ClientProperties.Id, KEY_MYFIELDCONTAINER);
         mapHead.put(ClientProperties.Items, headAp.createControl().get(ClientProperties.Items));
         e.getItems().add(mapHead);
        
         // 动态添加单据体字段
         EntryAp entryAp = this.createDynamicEntryAp();
         Map<String, Object> mapEntry = new HashMap<>();
         mapEntry.put(ClientProperties.Id, KEY_ENTRYENTITY);
         mapEntry.put(ClientProperties.Columns, entryAp.createControl().get(ClientProperties.Columns));
         e.getItems().add(mapEntry);
    }
   
    /**
     * 此事件在系统要用到表单主实体模型时触发
     * @param e
     * @remark
     * 插件修改原始主实体,注册自定义属性,返回新的主实体给系统
     */
    @Override
    public void getEntityType(GetEntityTypeEventArgs e) {
        
         // 取原始的主实体
         MainEntityType oldMainType = e.getOriginalEntityType();
         // 复制主实体
         MainEntityType newMainType = null;
         try{
             newMainType = (MainEntityType)oldMainType.clone();
         }
         catch (CloneNotSupportedException exp){
             throw new KDException(exp, new ErrorCode("LoadCustomControlMetasSample", exp.getMessage()));
         }
 
         // 为自定义的文本字段,向主实体注册文本属性
         this.registDynamicProps(newMainType);
        
         // 回传主实体给系统
         e.setNewEntityType(newMainType);
    }
 
    /**
     * 此事件在表单创建界面数据包时触发
     * @remark
     * 由插件自行创建界面数据包,包含自定义字段
     */
    @Override
    public void createNewData(BizDataEventArgs e) {
        
         DynamicObject dataEntity = new DynamicObject(this.getModel().getDataEntityType());
         dataEntity.set(KEY_AUTOTEXT1, "动态文本字段1的值");
        
         DynamicObjectCollection rows = dataEntity.getDynamicObjectCollection(KEY_ENTRYENTITY);
         DynamicObject newRow = new DynamicObject(rows.getDynamicObjectType());
         newRow.set(KEY_AUTOTEXT2, "动态文本字段2的值");
        
         rows.add(newRow);
        
         e.setDataEntity(dataEntity);
    }
   
    /**
     * 此事件在把数据绑定到界面之前触发:
     * 系统会调用FormDataBinder对象,把字段值输出给前端字段编辑控件;
     * @param e
     * @remark
     * 动态添加的字段,在FormDataBinder中并没有记录,因此,默认不会绑定动态添加的字段值;
     * 必须在此事件,向FormDataBinder中注册动态添加的字段
     */
    @Override
    public void beforeBindData(EventObject e) {
        
         // 单据头添加的字段、控件,注入到容器面板的控件编程模型中
         FlexPanelAp dynamicPanel = this.createDynamicPanel();
         Container myFldPanel = this.getView().getControl(KEY_MYFIELDCONTAINER);
         myFldPanel.getItems().addAll(dynamicPanel.buildRuntimeControl().getItems());
         this.getView().createControlIndex(myFldPanel.getItems()

loadCustomControlMetas事件

1 事件简介插件可以在loadCustomControlMetas事件修改显示参数,向前端动态增加控件。2 事件触发时机显示界面前,构建界面显示参数时,触...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信