事件触发器本身

时间:2015-05-25 10:41:58

标签: javascript sapui5

我不知道为什么只有按下按钮时才能运行的功能。

这是我的按钮声明:

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”

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

如果重要的话我使用SAP WEB IDE ......

2 个答案:

答案 0 :(得分:8)

此:

press: this.fnB()

调用 this.fnB()并使用其返回值初始化press属性,与x = foo() 调用的方式完全相同 {{1并将其返回值分配给foo

你可能想要

x

press: this.fnB

这样你就可以将函数的引用分配给press: this.fnB.bind(this) ,而不是调用它并使用它的返回值。

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

press

会将该功能分配给press: this.fnB ,但在运行时,press在调用this期间与fnB中的this不同上面的代码,因为在JavaScript中,函数中this的值通常取决于函数的调用方式。

使用Function#bind

press: this.fnB.bind(this)

...创建一个 new 函数,在调用时,将使用我们提供给this的{​​{1}}值来调用原始函数。

答案 1 :(得分:1)

如果要在SAPUI5中使用控制器中的功能,则应使用:

press: [this.fnB, oController]

此声明后this指的是控制器而不是事件