1

我正在使用很棒的 jQuery Isotope 插件 (http://isotope.metafizzy.co/),但是我在创建排序时遇到了问题。这更像是一个 JavaScript 问题,而不是与 Isotope 本身有关的任何事情。

问题是我正在动态构建排序数据。所以我创建了一个生成 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() 函数运行之后运行。导致排序数组中的最后一项被分配给 sort[i] 变量。

这显示在这个小提琴中:http: //jsfiddle.net/xzZR4/ 您会看到“名称”项始终输出到控制台。

我想不出另一种方法来创建允许传递正确排序名称的 getSortData 对象。

有任何想法的人吗?

4

1 回答 1

1

知道了...

真正需要的是允许排序字段名称变量在匿名排序函数内具有本地范围。因为我无法将排序字段直接传递给匿名函数(因为它是由同位素调用的,所以我无法控制传递给它的参数)。

所以诀窍是创建另一个返回匿名函数的函数,这会将字段作为参数,使其具有本地范围。

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());
  }
}
于 2012-10-17T11:51:46.243 回答