2012-08-24 57 views
2

我可能忽略某些東西或者只是一個noob,但是我無法將鍵值對傳遞給javascript函數。將動態鍵值對傳遞給函數

我正在編寫一個利用Backbone.View和Backbone.Paginator.clientPager集合的過濾模塊。我在clientPager中添加了一個名爲whereExpanded()的函數,它可以搜索整個集合而不用修改/渲染任何東西。

Backbone.Paginator.clientPager.prototype.whereExpanded = function(attrs) { 
    return _.filter(this.origModels, function(model) { 
    var key; 
    for (key in attrs) { 
     if (attrs[key] !== model.get(key)) { 
     return false; 
     } 
    }); 
}; 

正如你所看到的,它需要attrs變量並遍歷它。我希望能夠將關鍵值對傳遞給它,但是,關鍵和值需要是動態的。

collection.whereExpanded(filterByField, filterByValue) 

filterByField是我希望通過篩選和filterByValue就是我想過濾的屬性值的Backbone.Model的屬性。我嘗試過使用eval(),但我似乎無法讓它工作。

任何幫助將不勝感激!

回答

4

你不需要eval對於這一點,你可以用更好的方式建立一個對象:

var attrs = { }; 
attrs[filterByField] = filterByValue; 

而且隨着功夫小一點,你可以讓你的函數被調用各種不同的方式:

whereExpanded({ k1: v1, k2: v2 }); 
whereExpanded('k1', v1); 
whereExpanded('k1', v1, 'k2', v2); 

你只需要自己解析arguments像這樣的東西:

argv = [].slice.call(arguments); 
attrs = {}; 
if(argv.length == 1 && _(argv[0]).isObject()) { 
    attrs = argv[0]; 
} 
else if(argv.length % 2 == 0) { 
    for(var i = 0; i < argv.length; i += 2) { 
     attrs[argv[i]] = argv[i + 1]; 
    } 
} 
else { 
    throw 'Bad argument list'; 
} 

這會讓您看到attrs中的鍵/值對,即您的_.filter期望的值。

參數解析演示:http://jsfiddle.net/ambiguous/e5kkc/

+1

這是正確的答案。有[很好的理由不使用eval](http://stackoverflow.com/questions/86513/why-is-using-the-javascript-eval-function-a-bad-idea)。 – voithos

+0

eval是危險的,並且是XSS攻擊的目標。您可以使用eval的環境非常狹窄,但它們非常少,所以使用它沒有任何意義。如上所述,最好使用參數。 –

0

它看起來像eval()最終確實工作。我當時是一個小菜鳥。

eval("collection.whereExpanded({" + filterByField + ": " + filterByValue + "})")