TooltipBaseRenderer.js:404 - 未找到

时间:2017-01-09 09:15:27

标签: 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", { 
            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中得到了这个错误(这在处理新闻事件之前发生了。):

enter image description here

在TooltipBaseRenderer.js中就是这一行:

enter image description here

我不知道那里发生了什么。如果你愿意,我会很高兴听到它。

这就是我将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: {}, 

我收到了这个错误:

enter image description here

所以我删除了渲染器,当我将鼠标悬停在Icon上时,TooltipBase可以正常工作。问题是当我点击图标时,我描述得更高。

1 个答案:

答案 0 :(得分:1)

模块sap.ui.core.TooltipBase启用了元数据abstract,这首先是纯信息性的,但表示控件既没有renderer - 函数也没有任何专用 * Renderer.js 文件。 UI5尝试加载文件 TooltipBaseRenderer.js 但最终失败 - > 404 (更多解释如下)。从技术上讲,我们仍然可以直接实例化TooltipBase,但随后UI5警告:

  

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

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

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

  • 完全沟通TooltipBase并传递一个字符串:oFilterIcon.setTooltip("Filters");。该字符串将在鼠标悬停时显示为本机浏览器工具提示 如果这还不够令人满意,......
  • 创建自己的TooltipBase子类:

    1. 像您一样创建扩展TooltipBase的自定义控件(例如名为 MySubTooltip.js )。
    2. 在同一目录中创建 MySubTooltip 渲染器 .js (可能看起来为like this)。如果不在同一目录中,请声明renderer并为其分配相应的模块名称。
    3. TooltipBase triggers(例如鼠标悬停时) MySubTooltipRenderer.js 中定义的render - 方法。

      以下是扩展TooltipBase的最小示例:https://embed.plnkr.co/33zFqa/
      如果这听起来像是一种矫枉过正,......

  • 忘记工具提示,并在SAP的鼓励下使用popover

      

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

    当然,popover也可以与onmouseover结合使用(如here所示)但我们必须take UX aspects into consideration

为什么选择404?

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

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

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

    此时,我们可能会问:&#34;但sap.ui.core.Control也是抽象的。从它扩展后,为什么我们仍然可以渲染自定义控件而无需创建任何外部 * Renderer.js ?&#34; - &GT;核心控件中定义了 renderer。该值仅为null。这可确保UI5不会查找像 ControlRenderer.js 这样的文件(在步骤3情况B的情况下)。这样,RenderManager可以触发直接分配给目标自定义控件的renderer的功能 问题是TooltipBase甚至没有在其定义中声明renderer