2014-07-01 60 views
1

我正在爲事件show_keyboard創建偵聽器。在處理程序中,我需要解除此事件。在這種情況下,該事件是從本機android插件引發的。重新定義事件處理程序的上下文

appView.sendJavascript("cordova.fireWindowEvent('native.showkeyboard', { 'keyboardHeight':" + Integer.toString(keyboardHeight)+"});"); 

addHeightHandler,我需要this是父addHeightHandler爲了從中取消綁定。因此,當致電addHeightHandler時,我將通過self。但是,當我這樣做時,我無法訪問ekeyboardHeight屬性。

注:我的僱主堅持一定要做這樣的,沒有匿名函數或self可變

/* 
* When keyboard is shown, add height of keyboard to body to make scrollable. 
*/ 
this.addHeightHandler = function (e) { 
    keyboardHeight = e.keyboardHeight; 
    //e is undefined 
    //do some stuff to add keyboard height 
    window.removeEventListener('show_keyboard', this.addHeightHandler); 
}; 

/* 
* Listen for showkeyboard events thrown by native code on Android 
*/ 
this.addKeyboardListeners = function() { 
    var self = this; 
    window.addEventListener('native.showkeyboard', function() { 
     self.addHeightHandler(self) 
    }, false); 
}; 

我知道有這樣做的其他方式的全局設置,但是這是我的方式已經被指示去做。我相信通過selfaddHeightHandler意味着e會被覆蓋,這是正確的嗎?

回答

0

是以下內容:

this.addKeyboardListeners = function() { 
    var self = this; 
    window.addEventListener(eventConstants.nativeShowKeyboard, function() { 
     self.addHeightHandler(self); 
    }); 
}; 

正在通過self作爲e值。

您可以做的是將addHeightHandler函數綁定到所需的上下文。在addKeyboardListeners,您可以:

this.addKeyboardListeners = function() { 
    var handler = this.addHeightHandler.bind(this); 
    addEventListener(eventConstants.nativeShowKeyboard, handler); 
}; 

什麼上面所做的是「綁定」的addHeightHandler功能this的背景下,這意味着當它被調用時,函數內部的this關鍵字將是一個參考任何this當你約束它。

該函數仍然將e作爲參數,所以當事件發生並且處理程序運行時,e仍然是事件。

+0

這是好的,但解除綁定不會工作... – Mark

+0

喲是什麼意思?同樣,看着OP,你是否解除了同一個事件?你有''show_keyboard「'和'eventConstants.nativeShowKeyboard',那些是一樣的嗎? – Whymarrh

+0

是的,我編輯的問題。實際上,最終我並不需要解除綁定,所以你的答案完美無缺。謝謝! – Mark

相關問題