我使用鼠标悬停事件处理扩展了sap.ui.core.TooltipBase,该处理附加到ChartContainer中的某些sap.ui.core.Icon:
sap.ui.define(function () {
"use strict";
return sap.ui.core.TooltipBase.extend("dvd.rl.component.ChartContainer.parts.TooltipBase.TooltipBase", {
metadata: {
events: {
"onmouseover" : {}
}
},
oView: null,
setView : function(view){
this.oView = view;
},
// the hover event handler, it is called when the Button is hovered - no event registration required
onmouseover : function() {},
});
Everythink运行良好,但是当我点击ChartContainer中的Icon时,我从TooltipBaseRenderer.js中得到了这个错误(这在处理新闻事件之前发生了。):
在TooltipBaseRenderer.js中就是这一行:
我不知道那里发生了什么。如果你愿意,我会很高兴听到它。
这就是我将TooltipBase添加到sap.ui.core.Icon:
的方法// Add custom Icon for filter
var oFilterIcon = new sap.ui.core.Icon("filterButton", {
tooltip : "{i18n>filter}",
src : "sap-icon://filter",
press : [this.onHandleLocalFilterOpen,this]
});
// Add Icon to chart component
oChartContainer.addCustomIcon(oFilterIcon);
var oTooltipBase = new TooltipBase();
// set new TooltipBase to Icon
oFilterIcon.setTooltip(oTooltipBase);
EDITED 12:15 100117:
当我在TooltipBase.extend中使用渲染器时:
//just inherit the renderer as it is
renderer: {},
我收到了这个错误:
所以我删除了渲染器,当我将鼠标悬停在Icon上时,TooltipBase可以正常工作。问题是当我点击图标时,我描述得更高。
答案 0 :(得分:1)
模块sap.ui.core.TooltipBase启用了元数据abstract
,这首先是纯信息性的,但表示控件既没有renderer
- 函数也没有任何专用 * Renderer.js 文件。 UI5尝试加载文件 TooltipBaseRenderer.js 但最终失败 - > 404 (更多解释如下)。从技术上讲,我们仍然可以直接实例化TooltipBase,但随后UI5警告:
这是抽象基类[...]。不要创建此类的实例,而是使用具体的子类。 (src:TablePersoProvider也是抽象的)
不幸的是,所有公知的TooltipBase子类现已弃用:
这给我们留下了三个选择:
oFilterIcon.setTooltip("Filters");
。该字符串将在鼠标悬停时显示为本机浏览器工具提示
如果这还不够令人满意,...... 创建自己的TooltipBase子类:
renderer
并为其分配相应的模块名称。 TooltipBase triggers(例如鼠标悬停时) MySubTooltipRenderer.js 中定义的render
- 方法。
以下是扩展TooltipBase的最小示例:https://embed.plnkr.co/33zFqa/
如果这听起来像是一种矫枉过正,......
忘记工具提示,并在SAP的鼓励下使用popover:
如果要实现类似的行为,请使用 sap.m.Popover 控件。
当然,popover也可以与onmouseover
结合使用(如here所示)但我们必须take UX aspects into consideration。
但是为什么UI5正在寻找一个根本不存在的文件(TooltipBaseRenderer.js)?
根据源代码,这是UI5当前检索模块 TooltipBase.js 时的作用:
Control.extend
来电applySettings
。applySettings
中,UI5首先假设控件的渲染器名称为"<control name>"
+ "Renderer"
- &gt; "TooltipBaseRenderer"
并将其分配给控件实例以供日后使用(步骤3案例B)。此外,该方法还会检查控件的定义是否为renderer
。由于模块是抽象的(没有渲染器),因此该方法不做任何进一步的操作。TooltipBase.extend
,最终也会触发applySettings
- 方法。 UI5将"MySubTooltipBaseRenderer"
分配给控件实例,与步骤2相同。以下是问题中描述的两个404个案例:
renderer
,这很好,但是没有相应的 MySubTooltipBaseRenderer.js 。否则,RenderManager将检索该外部渲染器,然后调用render
- 方法,例如在鼠标悬停上。renderer
已定义但值无效(renderer: {}
)。在这种情况下,UI5尝试将扩展父渲染器设置为自定义控件的渲染器。在尝试检索父级的渲染器时,UI5报告404,因为父级是抽象的。没有名为"TooltipBaseRenderer"
的JS文件(参见步骤2)。总结一下:从抽象控件扩展的自定义控件必须实现自己的外部渲染器才能渲染(参见上面的示例)。
此时,我们可能会问:&#34;但sap.ui.core.Control也是抽象的。从它扩展后,为什么我们仍然可以渲染自定义控件而无需创建任何外部 * Renderer.js ?&#34; - &GT;核心控件中定义了 renderer
。该值仅为null
。这可确保UI5不会查找像 ControlRenderer.js 这样的文件(在步骤3情况B的情况下)。这样,RenderManager可以触发直接分配给目标自定义控件的renderer
的功能
问题是TooltipBase甚至没有在其定义中声明renderer
。