我在控制器中的onInit中有以下代码:
$("input").on("keydown", (
function(evt) {
if (evt.keyCode == 17 && (evt.ctrlKey)) {
evt.preventDefault();
that.onMoveStorageBin();
}
所以想法是,当我按下F11按钮时,会执行onMoveStorageBin函数。但是当我按下任何按钮时它不会进入onInit。这个处理keydown的正确位置在哪里? 谢谢, 添
答案 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');
}
});
}
这种方法有以下限制:
一个更好的解决方案是创建一个具有此事件的自定义控件。您可以在此处找到示例: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: {}
});