2017-04-11 90 views
0

我在我的控制器的OnInit以下代碼:SAPUI5的keydown不叫

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

            that.onMoveStorageBin(); 
         } 

所以,當我按下F11鍵,onMoveStorageBin功能會被處決的想法。但是當我按下任何按鈕時它不會進入onInit。哪裏是正確的地方來處理keydown的處理? 謝謝, Tim

回答

1

你應該在onAfterRendering生命週期鉤子上執行你的代碼片段。這是因爲在onInit中,jQuery調用將無法找到任何輸入(因爲與您的視圖對應的元素尚未添加到DOM中)。

根據描述和代碼,我知道你需要檢查F11 + CTRL是否被按下(因此檢查是evt.keyCode == 122 && evt.ctrlKey);如果你想要一個簡單的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控件的呈現方式的假設。
  • 它將偵聽器應用於全部現有輸入。您也可以使用其他選擇器(例如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: {} 
}); 
+0

謝謝您的評論和示例。不知道我是否理解你的第二種方法,我應該在哪裏放置自定義控件? – Tim

+0

請檢查[文檔](https://openui5.hana.ondemand.com/#docs/guide/91f1703b6f4d1014b6dd926db0e91070.html)。簡而言之,您應該在一個單獨的.js文件中定義自定義控件,並使用適當的名稱空間(基於您的根名稱空間和文件夾結構)。然後你可以在例如一個XML視圖並使用您的控件,因爲您可以使用任何其他標準的UI5控件。 –

+0

示例:[this](https://github.com/serban-petrescu/sbwo/blob/master/web/util/HelpVideo.js)中定義的自定義控件用於[this](https:// github。 com/serban-petrescu/sbwo/blob/master/web/fragment/dialog/HelpVideoDialog.fragment.xml)XML片段。 –