头图

源代码:

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 项目开发中,深入理解各种控件的内部工作原理对于构建高效、可维护的应用程序至关重要。


注销
1k 声望1.6k 粉丝

invalid