2013-02-06 35 views
4

我想了解流星中的Todos示例。有一段代碼,我不能做的意義:檢查流星中的輸入

// Returns an event map that handles the "escape" and "return" keys and 
// "blur" events on a text input (given by selector) and interprets them 
// as "ok" or "cancel". 
var okCancelEvents = function (selector, callbacks) { 
    var ok = callbacks.ok || function() {}; 
    var cancel = callbacks.cancel || function() {}; 

    var events = {}; 
    events['keyup '+selector+', keydown '+selector+', focusout '+selector] = 
    function (evt) { 
     if (evt.type === "keydown" && evt.which === 27) { 
     // escape = cancel 
     cancel.call(this, evt); 

    } else if (evt.type === "keyup" && evt.which === 13 || 
      evt.type === "focusout") { 
    // blur/return/enter = ok/submit if non-empty 
    var value = String(evt.target.value || ""); 
    if (value) 
     ok.call(this, value, evt); 
    else 
     cancel.call(this, evt); 
    } 
}; 
    return events; 
}; 

什麼events['keyup '+selector+', keydown '+selector+', focusout '+selector] = function(){}收益呢?

爲什麼我們需要將字符串轉換爲以下內容:String(evt.target.value || "")

上述函數的evt參數是否必須有.type,.target和.target.value?我可以傳遞什麼?

回答

4

我打破問題成其三個組成部分:

什麼活動[ 'KEYUP' +選擇器+',keydown'+選擇器+',focusout'+選擇器] =函數(){}屈服?

okCancelEvents方法是環繞該副牧師每個函數的結果的細節到自定義okcancel事件的單個功能keyupkeydownfocusout DOM事件的方式。

這產生被綁定到一個Template.todos.events implementation對象EventMap使得所有keyup,​​,和focusout事件來通過經由EventMapokcancel

爲什麼我們需要轉換爲以下字符串:String(evt.target.value ||「」)?

我不認爲這是必要的。 var value = evt.target.value || ""的工作原理也是如此,因爲瀏覽器將會使用interpret a string primitive as a string object

這個函數的evt參數是否必須有.type,.target和.target.value?我可以傳遞什麼?

evt參數是傳入的eventkeyup,​​,和focusout方法和targettarget.value是烘烤在此本機event對象的屬性。你不需要手工構造這個。

4

events['keyup '+selector+', keydown '+selector+', focusout '+selector] = function(){}創建一個流星映射按鍵(keyup,keydown)事件和失去焦點事件(focusout)的函數。這個函數被賦予並賦予流星模板系統以綁定到具有特定CSS選擇器的元素。

evt值包含觸發事件時觸發的DOM event值。唯一應該作爲evt傳遞的是當觸發該事件時給出的原始DOM event,該事件由event(作爲變量)在事件觸發時給出。

我最好用代碼解釋它。的待辦事項例如做相同的,除了它使用CSS選擇事件結合元件:

<input type="text" onkeyup="doSomething(event);"/> 
<script> 
//js code 
function doSomething(evt) { console.log(evt.target.value) } 
</script> 

String(evt.target.value || "")基本上確保瞭如果evt.target.value是一個字符串,在情況下,它被輸入爲別的東西。我不能100%確定什麼時候它不能是一個字符串,但我認爲瀏覽器不總是標準地觸發事件。

事件並不總是需要的。但它非常有用。在你給它的代碼示例中,用它來標識哪個文本框觸發了事件&什麼鍵被按下。事件

更多信息:

+0

非常感謝Akshat。太糟糕了,我只能接受一個答案,B/C你同樣好! – AdamNYC