同位素动态排序

时间:2012-10-16 17:00:51

标签: javascript jquery jquery-isotope

我正在使用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对象。

任何有想法的人?

1 个答案:

答案 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());
  }
}
相关问题