我可能忽略了某些东西或者只是一个菜鸟但是,我无法将键值对传递给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()
,但我似乎也无法使用它。
非常感谢任何帮助!
答案 0 :(得分: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
中的键/值对。
答案 1 :(得分:0)
看起来eval()最终确实起作用了。我当时是个菜鸟。
eval("collection.whereExpanded({" + filterByField + ": " + filterByValue + "})")