源代码:
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.Label
或sap.m.Text
实例,并据此决定是否为其设置工具提示。
自动列宽和 Pop-in 设置
- 设置自定义列宽度:如果启用了自动列宽 (
getEnableAutoColumnWidth()
),则为每个自定义列设置宽度。 - 调整 Pop-in 设置:对于非移动表格,如果设置了
getDemandPopin()
,则关闭此功能并记录错误。
其他初始化操作
- 移除模型上下文变化监听、标记控件初始化完成、更新个性化对话框设置、检查 Excel 导出和多单位行为支持、侦听智能筛选器、变体管理和工具栏内容创建,以及设置本地编辑模型,都是初始化过程的一部分,确保
SmartTable
控件完全配置并准备好与用户交互。
事件绑定和初始绑定触发
- 绑定属性变化事件:通过
attachEvent
方法监听_change
事件,以便在控件属性发生变化时做出响应。 - 触发初始化完成事件:通过
fireInitialise()
方法向外界通知控件已完成初始化。 - 触发初始数据绑定:最后,检查变体管理状态,并根据需要触发数据绑定,以确保表格加载显示数据。
总结
上述解释尝试深入分析了 SmartTable.prototype._onMetadataInitialised
方法的关键部分和执行逻辑。每个步骤都旨在确保 SmartTable
控件能够根据提供的配置和元数据正确初始化,提供灵活的个性化设置,并为最终用户呈现丰富、互动的数据表格视图。通过这种方式,SAP UI5 框架提供了强大的工具,支持开发人员创建高度定制的应用程序视图,满足复杂的业务需求。
请注意,这只是一个初步的概述,旨在提供对 SmartTable.prototype._onMetadataInitialised
方法功能和重要性的理解。在实际的 SAP UI5 项目开发中,深入理解各种控件的内部工作原理对于构建高效、可维护的应用程序至关重要。