Javascript 事件本身触发

Javascript 事件本身触发,javascript,sapui5,Javascript,Sapui5,我不知道为什么这个功能只有在按下按钮的时候才能运行,它是自己运行的 这是我的按钮声明: var oButton = new sap.m.Button({ id: "buttonId", text: "Yes", press: this.fnB() }); 我的控制器如下所示: sap.ui.controller("<controller-name>", { fnA: function(){

我不知道为什么这个功能只有在按下按钮的时候才能运行,它是自己运行的

这是我的按钮声明:

var oButton = new sap.m.Button({
    id: "buttonId",
    text: "Yes",
    press: this.fnB()
});
我的控制器如下所示:

sap.ui.controller("<controller-name>", {

    fnA: function(){<button_declaration_here>},

    fnB: function(){console.log("Hello from fnB!");}

});
当我运行应用程序时,我得到:

fnB你好

未捕获的TypeError:无法读取未定义的属性“0”

还没有按下按钮,为什么我会收到hello消息

如果重要的话,我会使用SAP WEB IDE…

这:

press: this.fnB()
调用this.fnB并使用其返回值初始化press属性,就像x=foo调用foo并将其返回值分配给x一样

你可能想要

press: this.fnB

这样,您就为要按下的函数分配了一个引用,而不是调用它并使用它的返回值

第二个例子可能需要一些解释:如果我们使用

press: this.fnB
这会将函数分配给press,但当它运行时,调用fnB期间的this与上面代码中的this不同,因为在JavaScript中,函数中this的值通常由函数的调用方式决定

使用Functionbind:


…创建一个新函数,当调用该函数时,该函数将使用我们给绑定的值调用原始函数。

若要使用SAPUI5中控制器的函数,应使用:

press: [this.fnB, oController]

在这个声明之后,它指的是控制器,而不是我想要按的事件:this.fnB。谢谢在我的特殊情况下,这指的是控制器,所以这里没有问题。但是你的评论还是很有帮助的,我看那是不必要的;
press: this.fnB.bind(this)
press: [this.fnB, oController]