Sapui5 TooltipBaseRenderer.js:404-未找到

Sapui5 TooltipBaseRenderer.js:404-未找到,sapui5,Sapui5,我使用鼠标覆盖事件处理扩展了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", {

我使用鼠标覆盖事件处理扩展了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中的图标时,我从TooltipBaseRenderer.js中得到了这个错误(这发生在处理press事件之前):

在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);
编辑时间:12:15 100117:

在TooltipBase.extend中使用渲染器时:

//just inherit the renderer as it is
renderer: {}, 
我得到了这个错误:

所以我删除了渲染器,当我将鼠标悬停在图标上时,TooltipBase会工作。问题是当我单击上面所述的图标时。

模块启用了元数据
抽象
,这首先是纯粹的信息,但表明控件既没有
呈现程序
-函数,也没有任何专用的*renderer.js文件。UI5尝试加载文件TooltipBaseRenderer.js,但最终失败-->404(下文将对此进行详细解释)。从技术上讲,我们仍然可以直接实例化TooltipBase,但UI5警告:

这是抽象基类[…]。不要创建此类的实例,而是使用具体的子类。(src:它也是抽象的)

不幸的是,TooltipBase的所有已知子类现在都已弃用:

这给我们留下了三个选择:

  • 完全抛弃工具提示库,而是传递一个字符串:
    oFilterIcon.setTooltip(“过滤器”)。该字符串将在鼠标悬停时显示为本机浏览器工具提示。
    如果这还不够令人满意
  • 创建自己的TooltipBase子类:

  • 创建一个自定义控件(例如名为MySubTooltip.js)来扩展TooltipBase,就像您所做的那样
  • 在同一目录中创建MySubTooltipRenderer.js(可以查看)。如果不在同一目录中,则声明并为其分配相应的模块名
  • 工具提示库(例如,在鼠标上方)是MySubTooltipRenderer.js中定义的
    render
    -方法

    下面是扩展工具提示库的一个简单示例:
    如果这一切听起来像是过火了

  • 忘记工具提示,改用SAP鼓励的:

    如果要实现类似的行为,请使用sap.m.Popover控件

    当然,popover也可以与onmouseover结合使用(如中所示),但我们必须这样做


为什么是404? 但为什么UI5要寻找一个根本不存在的文件(TooltipBaseRenderer.js)

根据源代码,这是UI5当前在检索模块TooltipBase.js时执行的操作:

  • 在,
    控件中。最终扩展
    调用
  • applySettings
    中,UI5首先假定控件的呈现器名称为
    +
    “renderer”
    -->
    “TooltipBaseRenderer”,并将其分配给控件实例供以后使用(步骤3案例B)。此外,该方法还检查控件的定义中是否包含
    呈现程序
    。由于模块是抽象的(没有渲染器),因此该方法不做任何进一步的操作
  • 接下来,在我们的自定义控件MySubTooltipBase.js中,调用了
    TooltipBase.extend
    ,这也将最终触发
    applySettings
    -方法。UI5将
    “MySubTooltipBaseRenderer”
    分配给与步骤2相同的控件实例。以下是问题中描述的两个404案例:
    • 404 A:在自定义控件中没有声明任何
      渲染器
      ,这很好,但是也没有相应的MySubTooltipBaseRenderer.js。否则,将检索该外部渲染器,然后调用
      render
      -方法,例如在鼠标悬停时
    • 404 B:
      已定义呈现程序
      ,但该值无效(
      呈现程序:{}
      )。在本例中,UI5尝试将扩展父级渲染器设置为自定义控件的渲染器。在尝试检索父级的呈现程序时,UI5报告404,因为父级是抽象的。没有名为“TooltipBaseRenderer”
      的JS文件(请参见步骤2)
  • 总而言之:从抽象控件扩展而来的自定义控件必须实现自己的外部渲染器才能进行渲染(请参见上面的示例)

    在这一点上,我们可能会问:“但是也是抽象的。当从它扩展时,为什么我们仍然可以在不创建任何外部*Renderer.js的情况下呈现自定义控件?”——>核心控件中定义了
    Renderer
    。该值仅为
    null
    。这确保UI5不会查找像ControlRenderer.js这样的文件(在类似步骤3和案例B的情况下)。通过此操作,RenderManager可以触发直接分配给目标自定义控件的
    呈现程序的函数。

    问题是TooltipBase在其定义中甚至没有声明
    呈现程序

    您可以为它创建JSFIDLE吗,我可以调试。您的自定义控件必须声明呈现程序,但它没有声明:)@Sunil,感谢您对这个问题感兴趣。您可以在这里进行调试,但我不知道如何将我的TooltipBase.js包含到索引中,因此我对其进行了注释。@Ash,感谢您对本期文章感兴趣。但除非我没有按下图标,否则QuickView工作正常。我试图将渲染器用作:renderer:{},但它会引发错误,因此我将其删除。@Ash:如果在自定义控件中声明渲染器方法,则会出现错误:
    /sap/ui/core/TooltipBaseRenderer.js
    。我认为问题在于
    TooltipBase
    没有定义
    renderer
    方法。如果我在控制台中执行以下代码:
    sap.ui.core.TooltipBase.prototype.getRenderer()
    ,我将从reso获得
    sap/ui/core/TooltipBaseRenderer.js