2016-11-04 16 views
0

使用Javascript(ES6),我需要引用處理函數onKeyup,以便我可以在同一對象中聲明的兩個函數中添加和刪除事件偵聽器。對對象結構的修改很少,如何從同一個對象的另一個函數引用一個函數?

你會看到我如何從對象的兩個bindunbind函數中訪問那個函數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); 
    } 
} 

你有更好的,更清潔的方式做到這一點?

注意:我無法更改該對象中的bindunbind函數的結構,因爲它用作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

+0

你的願望是什麼?你想讓你的出口只包含bind()和unbind()(其他所有內容都是私有的)是你的問題嗎? – Makyen

+0

@Makyen理想的情況是,我希望導出保持接近默認的vue.js指令結構,這意味着'bind()','unbind()'(以及默認的'inserted()', 'update()'和'componentUpdated()'函數)。我的事件處理程序可能會變得很大,並且它們每個都可以調用多個函數,因此我希望儘可能將邏輯保留在每個「官方」vue.js函數中。我最後的編輯我猜是可以接受的,因爲我只需要聲明處理程序,而不是像'foobar()'這樣的內部函數。 – Alex

+0

您可能想要更改標題和問題中的某些文本。即使從一開始,標題並沒有真正反映你的要求。您已經確定如何引用在同一對象中聲明爲屬性的函數(即'this.functionName')。 – Makyen

回答

1

你應該能夠使用IIFE來封裝所有內容,只顯示bind()unbind()函數。

export default (function() { 
    var privateVar; 

    function onKeyup() { 
     console.log('onKeyup hit'); 
     foobar(); 
    } 

    function foobar() { 
     console.log('Foobar hit', privateVar); 
    } 

    function _bind(el) { 
     privateVar = 42; 
     el.addEventListener("keyup", onKeyup, false); 
    } 

    function _unbind(el) { 
     el.removeEventListener("keyup", onKeyup, false); 
    } 

    return { 
     bind:_bind, 
     unbind:_unbind 
    }; 
})(); 
+0

謝謝你的回答。我設法通過只添加IIFE,在函數的開頭聲明'let onKeyup,onPaste;',然後在'bind()'函數中執行onKeyup = function(e){} 。 – Alex

+0

我很高興能夠提供幫助。是的,有很多方法來組織它,這取決於你想要什麼。爲了說明IIFE,我決定保持簡單。 – Makyen

相關問題