[英]Passing dynamic key-value pairs to function
我可能忽略了某些東西,或者只是一個菜鳥而已,但是我無法將鍵值對傳遞給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
是Backbone.Model的屬性,我希望過濾的對象, filterByValue
是我要過濾的屬性的值。 我嘗試使用eval()
但似乎也無法使它正常工作。
任何幫助將不勝感激!
您不需要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';
}
這將使您擁有_.filter
期望的attrs
中的鍵/值對。
參數解析演示: http : //jsfiddle.net/ambiguous/e5kkc/
看來eval()最后確實起作用了。 我是菜鳥。
eval("collection.whereExpanded({" + filterByField + ": " + filterByValue + "})")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.