1

私は素晴らしい 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() 関数全体が実行された後に、内部の無名関数が常に実行されることです。sort[i] 変数に割り当てられている sorts 配列の最後の項目になります。

これは、次のフィドルに示されています: http://jsfiddle.net/xzZR4/ 「名前」項目が常にコンソールに出力されることがわかります。

正しいソート名を渡すことができる getSortData オブジェクトを作成する別の方法は考えられません。

アイデアのある人はいますか?

4

1 に答える 1

1

とった...

本当に必要だったのは、ソート フィールド名変数が無名ソート関数内でローカル スコープを持つことを可能にすることでした。並べ替えフィールドを無名関数に直接渡すことができなかったため (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());
  }
}
于 2012-10-17T11:51:46.243 に答える