2

我可能忽略了某些东西,或者只是一个菜鸟,但是,我无法将键值对传递给 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(),但我似乎也无法让它发挥作用。

任何帮助将不胜感激!

4

2 回答 2

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/

于 2012-08-24T17:48:14.473 回答
0

看起来 eval() 最终确实起作用了。我是个菜鸟。

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

于 2012-08-24T17:42:08.590 回答