Javascript 此.getView()在事件回调后返回未定义的

Javascript 此.getView()在事件回调后返回未定义的,javascript,sapui5,Javascript,Sapui5,在ui5控制器中,我在onBeforeRending函数中调用我的方法。在该方法中,我调用this.getView().getId(),这是我正在使用的库所需要的,这很好: onBeforeRendering: function () { this.func(); }, func: function() { this.getView().getId(); } 稍后,我有一个html控件的onClick事件处理程序: click: function () { cons

在ui5控制器中,我在
onBeforeRending
函数中调用我的方法。在该方法中,我调用this.getView().getId(),这是我正在使用的库所需要的,这很好:

onBeforeRendering: function () {
    this.func();
}, 

func: function() {
    this.getView().getId();
}
稍后,我有一个html控件的onClick事件处理程序:

click: function () {
    const controller = sap.ui.controller("Project.controller.Controller");
    controller.func();
}
当从
controller.func
调用
this.getView()
时,我得到以下错误:

Uncaught TypeError: Cannot read property 'getId' of undefined
  func
  click 
我意识到这意味着getView()返回未定义的
,但我不知道为什么。在第二次调用中检查
func
中的
this
引用表明它可以访问控制器中的其他函数,但不能访问
getView

编辑:

通过将视图绑定到一个变量,然后在点击回调中捕获它,我解决了这个问题

let view = this.getView()
后来

click: function() {
    const controller = sap.ui.controller("Project.controller.Controller");

    controller.getView = function () {
        return view;
    };

    controller.func();
} 

试图回答,因为评论中有太多的东西要坚持

如果您使用的是第三方库,那么将代码封装在自定义控件中仍然非常有用。该控件可以在以后的各种其他应用程序中重用,并允许从控件外部绑定数据和处理程序,如您放置该控件的视图的控制器所提供的那样

此外,如果您使用的是SAPUI5而不是OpenUI5,那么您可以访问D3的UI5包装器(它将一起取代此解决方案)

下面是自定义控件的框架代码。替换路径和名称空间等:

sap.ui.define(
  ['sap/ui/core/Control', '../path/to/highcharts'],
  function(Control) {
    "use strict";

    return Control.extend("my.namespace.graph", {
      metadata: {
          events : {
            "graphClick" : {}
          }
      },

      init: function() {
        //initialisation. 
      },

      renderer: function(element, control) {
        element.write(`<div id="my-graph"></div>`);
      },

      onAfterRendering: function() {
        //do whatever you need to bind a handler to your graph. You can call a function on 
        //this control like this.onClick, below. 
      },

      onClick: function(data) {
        this.fireGraphClick(data);
      }
    });
  });
不要忘记将控件添加到xml命名空间


您可以在

中找到有关自定义控件的更多信息,onClick处理程序在哪里?这在自定义控件中吗?我认为您只是获取了一个控制器,它没有连接到当前视图,如果这是目的的话。@Jorg我如何将它连接到我想要的视图?所以它是一个自定义控件?答案将取决于它是什么is@Jorg是的,它是一个highchart.js图形,但它只是导入并放置到视图中,并像普通的highchart图形一样运行。没有创建和注册自定义控件。@Jorg我发现您可以使用
sap.ui.xmlview(“Project.view.view”)
来获取视图,但这似乎创建了一个新的视图,并且没有与当前视图相同的id。如何获得具有正确id的当前视图?事件应位于属性外部。这是元数据的后代。渲染器函数错误,需要添加控制数据。我已移动事件。老实说,我真的不知道控件数据中有什么,但是添加ui5控件类和ID可能会影响第三方库。
<controls:graph graphClick="myControllerFunction" />