2014-10-28 38 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功能检查它的第一个参数的存在。