源代码:
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 项目开发中,深入理解各种控件的内部工作原理对于构建高效、可维护的应用程序至关重要。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。