Javascript 此.getView()在事件回调后返回未定义的
在ui5控制器中,我在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
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" />