2012-10-16 45 views
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()函數運行後運行。導致sorts數組中的最後一項被分配給sort [i]變量。

這是在這個小提琴中顯示:http://jsfiddle.net/xzZR4/ 你會看到,'name'項總是輸出到控制檯。

我想不出另一種方法來創建getSortData對象,它將允許傳遞正確的排序名稱。

任何有任何想法的人?

回答

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()); 
    } 
} 
+0

這與插入的最後一個元素有什麼關係? – Bytemain

+0

Chiyou你是什麼意思?這與插入的最後一個元素無關,而是關於種類。 –

+0

我看不到舊代碼有任何改進或改變? – Bytemain