SAP UI5 SmartTable.prototype._onMetadataInitialised 方法的深入介绍

算法溯光者
• 阅读 206

源代码:

SmartTable.prototype._onMetadataInitialised = function() {
        this._bMetaModelLoadAttached = false;
        if (this.bIsInitialised) {
            return;
        }

        this._bUseColumnLabelsAsTooltips = this.getUseColumnLabelsAsTooltips(); // keep value stable after initialization

        // Check whether further custom columns where added in the meantime
        this._updateInitialColumns();
        this._fireBeforeInitialiseAndValidate();
        this._validateCustomizeConfig(this.getCustomizeConfig());
        this._createTableProvider();
        if (!this._oTableProvider) {
            return;
        }

        this._aTableViewMetadata = this._oTableProvider.getTableViewMetadata();
        if (!this._aTableViewMetadata) {
            return;
        }

        if (this._bUseColumnLabelsAsTooltips) {
            this._oTable.getColumns().forEach(function(oColumn) {
                var oHeader = null;
                if (oColumn.getHeader) {
                    oHeader = oColumn.getHeader();
                } else if (oColumn.getLabel) {
                    oHeader = oColumn.getLabel();
                }

                var oLabel = oHeader && oHeader.isA && (oHeader.isA("sap.m.Label") || oHeader.isA("sap.m.Text")) ? oHeader : null;
                var oTooltipTarget = this._isMobileTable ? oLabel : oColumn;

                var oTooltip = oTooltipTarget ? oTooltipTarget.getTooltip() : null;
                if (oTooltipTarget && oLabel && !oTooltip && !oTooltipTarget.isBound("tooltip")) {
                    if (oLabel.isBound("text")) {
                        var oBindingInfo = _getClonedBindingInfo(oLabel.getBindingInfo("text"));
                        oTooltipTarget.bindProperty("tooltip", oBindingInfo);
                    } else {
                        oTooltipTarget.setTooltip(oLabel.getText());
                    }
                }
            }, this);
        }

        // Set width for custom columns after metadata is initialized
        if (this.getEnableAutoColumnWidth()) {
            this._oTable.getColumns().forEach(this._setWidthForCustomColumn, this);
        }

        if (!this._isMobileTable && this.getDemandPopin()) {
            this.setDemandPopin(false);
            Log.error("use SmartTable property 'demandPopin' only  with responsive table, property has been set to false");
        }
        this.detachModelContextChange(this._initialiseMetadata, this);
        // Indicates the control is initialised and can be used in the initialise event/otherwise!
        this.bIsInitialised = true;
        delete this._bInitialising;

        this._updateP13nDialogSettings(true);

        this._bTableSupportsExcelExport = this._oTableProvider.getSupportsExcelExport();
        this._bMultiUnitBehaviorEnabled = this._oTableProvider.getMultiUnitBehaviorEnabled();
        this._listenToSmartFilter();
        this._createVariantManagementControl(); // creates VariantMngmntCtrl if useVariantManagement OR useTablePersonalisation is true.
        // Control is only added to toolbar if useVariantManagement is set otherwise it acts as
        // hidden persistance helper
        this._createToolbarContent();
        this._applyToolbarContentOrder();
        this._aAlwaysSelect = this._oTableProvider.getRequestAtLeastFields();
        this._createContent();
        this._createPersonalizationController();
        // Create a local JSONModel to handle editable switch
        this._oEditModel = new JSONModel({
            editable: this.getEditable()
        });
        // Set the local model on the SmartTable
        this.setModel(this._oEditModel, "sm4rtM0d3l");

        this.attachEvent("_change", this._onPropertyChange, this);

        this.fireInitialise();
        // Trigger initial binding if no Variant exists -or- if it is already initialised
        if (!this._oVariantManagement || (this._oVariantManagement && this._bVariantInitialised)) {
            this._checkAndTriggerBinding();
        }
    };

解析 SmartTable.prototype._onMetadataInitialised 函数

该函数是 SAP UI5 中 SmartTable 控件的一个方法,主要负责在元数据初始化完成后设置表格的一些核心功能和行为。此方法是内部方法,通常在控件初始化过程中自动调用。

元数据初始化后的处理

  • 标记元数据加载状态:函数开始时,将 _bMetaModelLoadAttached 标记为 false,表示不再监听元数据加载事件。
  • 初始化检查:通过 bIsInitialised 标记确保控件不会被重复初始化。

配置列标签作为工具提示

  • 使用列标签作为工具提示_bUseColumnLabelsAsTooltips 标记根据 getUseColumnLabelsAsTooltips() 方法的返回值设置,决定是否将列的标签用作鼠标悬停时的工具提示。

更新和验证自定义配置

  • 更新初始列_updateInitialColumns() 方法检查是否有新的自定义列被添加,并进行更新。
  • 触发初始化前事件并验证自定义配置:通过 _fireBeforeInitialiseAndValidate()_validateCustomizeConfig() 方法,分别触发初始化前的事件和验证自定义配置。

创建表格提供者

  • 表格提供者创建_createTableProvider() 方法负责创建表格数据的提供者,这是一个关键步骤,因为表格提供者负责获取和处理表格所需的数据和元数据。

配置列的工具提示

  • 为列设置工具提示:如果 _bUseColumnLabelsAsTooltips 为真,遍历表格的列,为每个列配置工具提示。此过程涉及到判断列头部是否存在,是否为 sap.m.Labelsap.m.Text 实例,并据此决定是否为其设置工具提示。

自动列宽和 Pop-in 设置

  • 设置自定义列宽度:如果启用了自动列宽 (getEnableAutoColumnWidth()),则为每个自定义列设置宽度。
  • 调整 Pop-in 设置:对于非移动表格,如果设置了 getDemandPopin(),则关闭此功能并记录错误。

其他初始化操作

  • 移除模型上下文变化监听标记控件初始化完成更新个性化对话框设置检查 Excel 导出和多单位行为支持侦听智能筛选器变体管理和工具栏内容创建,以及设置本地编辑模型,都是初始化过程的一部分,确保 SmartTable 控件完全配置并准备好与用户交互。

事件绑定和初始绑定触发

  • 绑定属性变化事件:通过 attachEvent 方法监听 _change 事件,以便在控件属性发生变化时做出响应。
  • 触发初始化完成事件:通过 fireInitialise() 方法向外界通知控件已完成初始化。
  • 触发初始数据绑定:最后,检查变体管理状态,并根据需要触发数据绑定,以确保表格加载显示数据。

总结

上述解释尝试深入分析了 SmartTable.prototype._onMetadataInitialised 方法的关键部分和执行逻辑。每个步骤都旨在确保 SmartTable 控件能够根据提供的配置和元数据正确初始化,提供灵活的个性化设置,并为最终用户呈现丰富、互动的数据表格视图。通过这种方式,SAP UI5 框架提供了强大的工具,支持开发人员创建高度定制的应用程序视图,满足复杂的业务需求。

请注意,这只是一个初步的概述,旨在提供对 SmartTable.prototype._onMetadataInitialised 方法功能和重要性的理解。在实际的 SAP UI5 项目开发中,深入理解各种控件的内部工作原理对于构建高效、可维护的应用程序至关重要。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
徐小夕 徐小夕
4年前
《前端实战总结》之使用CSS3实现酷炫的3D旋转透视
3D动画效果现在越来越普及,已经被广泛的应用到了各个平台,比如阿里云,华为云,webpack官网等。它可以更接近于真实的展示我们的产品和介绍,带来极强的视觉冲击感。所以说,为了让自己更加优秀,css33D动画必不可少。你将学到CSS33D转换的常用API介绍CSS33D应用场景CSS33D实现一个立方体开始1.CSS
Stella981 Stella981
3年前
Fedora 33
最近Fedora33上配置ssh连接到gitee出现错误:Permissiondenied(publickey)查看具体信息: $sshvTgit@gitee.comOpenSSH_8.4p1,OpenSSL1.1.1iFIPS8Dec2020...debug1:Conne
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Wesley13 Wesley13
3年前
mysql出现Waiting for table metadata lock的解决方法
查询某一个表时,一直没有显示数据,于是就showprocesslist;!(https://oscimg.oschina.net/oscnet/07f86cfca979bba85837f1b6352eb00ec33.jpg)发现有表已经被锁了,关掉了之前的查询语句可以看到!(https://oscimg.oschina.net/oscn
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
算法溯光者
算法溯光者
Lv1
愿山野浓雾都有路灯,风雨漂泊都有归舟。
文章
8
粉丝
0
获赞
0