我正在使用jQuery Isotope插件(http://isotope.metafizzy.co/)这很棒,但我在创建排序时遇到问题。与Isotope本身无关,这更像是一个JavaScript问题。
问题是我正在动态构建排序数据。所以我创建了一个生成sortData的函数。以下示例:
function getSortData(){
sortData = {};
var sorts = ['symbol', 'number', 'score', 'name'];
for (var i in sorts) {
sortData[sorts[i]] = function($elem) {
console.log(sorts[i]);
return parseInt($elem.find('.'+ sorts[i]).text());
}
}
return sortData;
}
所以问题是内部的匿名函数总是在整个getSortData()函数运行后运行。导致sorts数组中的最后一项被分配给sort [i]变量。
这显示在这个小提琴中:http://jsfiddle.net/xzZR4/ 您会看到“名称”项始终输出到控制台。
我想不出另一种方法来创建允许传递正确排序名称的getSortData对象。
任何有想法的人?
答案 0 :(得分:1)
得到了......
真正需要的是允许sort字段名称变量在匿名排序函数中具有本地范围。因为我无法将sort字段直接传递给匿名函数(因为它是由Isotope调用的,所以我无法控制传递给它的参数)。
所以诀窍是创建另一个返回匿名函数的函数,这会将该字段作为参数,使其具有局部范围。
function getSortData(){
sortData = {};
var sorts = ['symbol', 'number', 'score', 'name'];
var sortField;
for (var i in sorts) {
sortField = sorts[i];
sortData[sortField] = getSortDataCallback(sortField)
}
return sortData;
}
function getSortDataCallback(sortField) {
return function($elem) {
return parseInt($elem.find('.'+ sortField).text());
}
}