onInit中的SAPUI5 keydown未调用

时间:2017-04-11 13:19:02

标签: sapui5 onkeydown

我在控制器中的onInit中有以下代码:

   $("input").on("keydown", (
            function(evt) {
                        if (evt.keyCode == 17 && (evt.ctrlKey)) {
                                     evt.preventDefault();

                                     that.onMoveStorageBin();
                        }

所以想法是,当我按下F11按钮时,会执行onMoveStorageBin函数。但是当我按下任何按钮时它不会进入onInit。这个处理keydown的正确位置在哪里? 谢谢, 添

1 个答案:

答案 0 :(得分:1)

您应该在onAfterRendering生命周期挂钩上执行您的代码段。这是因为在onInit中,jQuery调用将无法找到任何输入(因为与您的视图对应的元素尚未添加到DOM中)。

根据描述和代码,我知道你需要检查是否按下了F11 + CTRL(因此检查是evt.keyCode == 122 && evt.ctrlKey);如果你想要一个sinple F11,你只需要检查evt.keyCode == 122

你可以在这里找到一个工作小提琴:https://jsfiddle.net/8kcs8xch/4/

 onAfterRendering: function() {
   jQuery("input").on("keydown",
     function(evt) {
       if (evt.keyCode == 122 && evt.ctrlKey) {
         evt.preventDefault();
         sap.m.MessageToast.show('Alert');
       }
     });
 }

这种方法有以下限制:

  • 它直接使用DOM,并假设UI5控件的呈现方式。
  • 它在 ALL 现有输入上应用侦听器。你也可以通过使用其他选择器来调解它(例如CSS)。

一个更好的解决方案是创建一个具有此事件的自定义控件。您可以在此处找到示例:https://jsfiddle.net/8kcs8xch/3/

基本上,您需要通过在新控件中声明DOM处理程序来侦听keydown事件。然后,您可以根据此DOM事件定义自定义UI5事件(我简称为alert):

var CustomInput = sap.m.Input.extend("CustomInput", {
   metadata: {
     events: {alert: {}}
   },
   onkeydown: function(evt) {
     if (evt.keyCode == 122 && evt.ctrlKey) {
       // only prevent the default of the DOM event if the
       // UI5 event's preventDefault is called as well.
       if (!this.fireEvent("alert", {}, true)) {
           evt.preventDefault();
       }
     }
   },
   renderer: {}
});