未调用onInit中的SAPUI5向下键

未调用onInit中的SAPUI5向下键,sapui5,onkeydown,Sapui5,Onkeydown,我在控制器的onInit中有以下代码: $("input").on("keydown", ( function(evt) { if (evt.keyCode == 17 && (evt.ctrlKey)) { evt.preventDefault(); t

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

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

                                     that.onMoveStorageBin();
                        }
所以我的想法是,当我按下F11按钮时,onMoveStorageBin函数将被执行。但当我按下任何按钮时,它都不会进入onInit。钥匙扣的正确操作位置在哪里? 谢谢
Tim

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

根据描述和代码,我理解您需要检查是否按下了F11+CTRL键(因此检查为
evt.keyCode==122&&evt.ctrlKey
);如果想要单F11,只需选中
evt.keyCode==122

你可以在这里找到一把小提琴:

onAfterRendering:function(){
jQuery(“输入”)。在(“键控”上,
功能(evt){
if(evt.keyCode==122&&evt.ctrlKey){
evt.preventDefault();
sap.m.MessageToast.show('Alert');
}
});
}
这种方法有以下局限性:

  • 它直接使用DOM,并对UI5控件的呈现方式进行假设
  • 它将侦听器应用于所有现有输入。您也可以通过使用其他选择器(例如CSS)进行调解
更好的解决方案是创建具有此事件的自定义控件。您可以在此处找到一个示例:

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

var CustomInput=sap.m.Input.extend(“CustomInput”{
元数据:{
事件:{警报:{}
},
onkeydown:功能(evt){
if(evt.keyCode==122&&evt.ctrlKey){
//仅当
//UI5事件的preventDefault也被调用。
如果(!this.firevent(“alert”,{},true)){
evt.preventDefault();
}
}
},
渲染器:{}
});

感谢您的评论和示例。不确定我是否理解您的第二种方法,我应该将自定义控件放在哪里?请检查。简而言之,您应该在一个单独的.js文件中定义自定义控件,并使用适当的名称空间(基于根名称空间和文件夹结构)。然后,您可以在XML视图中引用您的命名空间,并像使用任何其他标准UI5控件一样使用您的控件。例如:定义的自定义控件在XML片段中使用。