2014-10-28 80 views
1
$("#searchType").on('change', function() { 
    var selectionAction = { 
     All: loadAll(), 
     Competitions: loadAll("competitions"), 
     Clubs: loadAll("clubs"), 
     Teams: loadAll("teams") 
    }; 
    var selection = $("#searchType").find('option:selected').val(); 
    selectionAction[selection] 
}); 

請參閱上面的代碼。這個想法是,當選擇等於我的對象的屬性之一,那麼相應的函數將被調用。Javascript:定義功能圖

例如當選擇等於Competitions那麼我們將調用loadAll("competitions")函數。

取而代之的是,當它進入onChange功能,它調用所有功能。

我在這裏做錯了什麼?

+2

無論何時在函數引用後面有'()',函數都會被調用。 'All:loadAll(),'調用函數'loadAll'並將返回值賦給屬性'All'。 – 2014-10-28 23:49:25

回答

5

使用匿名函數進行呼叫。目前你是存儲該未定義

var selectionAction = { 
    All: function(){loadAll()}, 
    Competitions: function(){loadAll("competitions")}, 
    Clubs: function(){loadAll("clubs")}, 
    Teams: function(){loadAll("teams")} 
}; 
var selection = $("#searchType").find('option:selected').val(); 
selectionAction[selection]();// make sure to call the anonymous function 

或者,如果你喜歡簡潔的函數調用的結果,

$("#searchType").on('change', function() { 
loadAll($("#searchType").find('option:selected').val().replace("All","").toLowerCase()) 
}); 
+0

你可以對所有這些使用bind()而不是anons。這裏沒有錯,只是說... – dandavis 2014-10-28 23:46:13

+0

@dandavis - 燁,我曾考慮過,以及一個選項。這是一個首選項,當我沒有利用'this'上下文時,我傾向於不使用綁定。 – 2014-10-28 23:47:33

2

如果指定loadAll()loadAll("competitions")loadAll("clubs")等你實際上是在執行立即起作用。你想要做的是有你的對象有非功能性要求,像這樣:

var selectionAction = { 
    All: '', 
    Competitions: 'competitions', 
    Clubs: 'clubs', 
    Teams: 'teams' 
    }; 

然後執行:

var selection = $("#searchType").find('option:selected').val(); 
loadAll(selectionAction[selection]); 

,並確保您loadAll功能檢查它的第一個參數的存在。