使用Javascript(ES6),我需要引用處理函數onKeyup
,以便我可以在同一對象中聲明的兩個函數中添加和刪除事件偵聽器。對對象結構的修改很少,如何從同一個對象的另一個函數引用一個函數?
你會看到我如何從對象的兩個bind
和unbind
函數中訪問那個函數onKeyup
? :
export default {
bind(el) {
let privateVar = 42;
function foobar() {
console.log('Foobar hit', privateVar);
}
function onKeyup() {
console.log('onKeyup hit');
foobar();
}
el.addEventListener("keyup", onKeyup, false);
},
unbind(el) {
//`onKeyup` does not exist here, how can I fix that?
el.removeEventListener("keyup", onKeyup, false);
}
}
這可能嗎?
我首先想到的是修改這樣的代碼,但結果卻是在我看來不易閱讀:
export default {
privateVar : null,
onKeyup() {
console.log('onKeyup hit');
this.foobar();
},
foobar() {
console.log('Foobar hit', this.privateVar);
},
bind(el) {
this.privateVar = 42;
el.addEventListener("keyup", this.onKeyup, false);
},
unbind(el) {
el.removeEventListener("keyup", this.onKeyup, false);
}
}
你有更好的,更清潔的方式做到這一點?
注意:我無法更改該對象中的bind
和unbind
函數的結構,因爲它用作Vue.js 2. *的directive declaration。
編輯:
我也嘗試組織我的代碼的第二個辦法:
export default {
onKeyup : null,
bind(el) {
let privateVar = 42;
function foobar() {
console.log('Foobar hit', privateVar);
}
this.onKeyup = function() {
console.log('onKeyup hit');
foobar();
};
el.addEventListener("keyup", this.onKeyup, false);
},
unbind(el) {
el.removeEventListener("keyup", this.onKeyup, false);
}
}
......但後來我看到此錯誤消息:Uncaught TypeError: Cannot set property 'onKeyup' of undefined
你的願望是什麼?你想讓你的出口只包含bind()和unbind()(其他所有內容都是私有的)是你的問題嗎? – Makyen
@Makyen理想的情況是,我希望導出保持接近默認的vue.js指令結構,這意味着'bind()','unbind()'(以及默認的'inserted()', 'update()'和'componentUpdated()'函數)。我的事件處理程序可能會變得很大,並且它們每個都可以調用多個函數,因此我希望儘可能將邏輯保留在每個「官方」vue.js函數中。我最後的編輯我猜是可以接受的,因爲我只需要聲明處理程序,而不是像'foobar()'這樣的內部函數。 – Alex
您可能想要更改標題和問題中的某些文本。即使從一開始,標題並沒有真正反映你的要求。您已經確定如何引用在同一對象中聲明爲屬性的函數(即'this.functionName')。 – Makyen