为什么没有'方法根据上下文返回不同的结果?

时间:2014-10-05 11:49:55

标签: javascript backbone.js underscore.js

我想使用Backbone collection方法过滤_.without

它以这种形式的调用返回正确的结果(仅完成Todos):

return this.without.apply(this, this.active());

但不在这一个:

return _.without(this.models, this.active());

在后面的语句中,它返回包含 ALL 模型的数组。

我不能直接使用Underscore方法,而只能通过Backbone的this上下文?

如何使第二个声明有效?

todos.js

var app = app || {};

var Todos = Backbone.Collection.extend({
  model: app.Todo,
  active: function() {
    return this.filter(function(todo) {
      return todo.get('completed') === false;
    });
  },
  completed: function() {
    return this.without.apply(this, this.active());
    // return _.without(this.models, this.active()); <--- Problem is here
  }
});

app.Todos = new Todos();

稍后添加:

由于_ .without方法不接受数组,因为第二个参数_.difference更适合我的任务。

return _.difference(this.models, this.active());

1 个答案:

答案 0 :(得分:2)

问题是你不正确地使用了Undersore的without方法。它期望第二个参数的标量值,而您传递array

实际上你根本不需要_.without

请勿尝试在active方法中重复使用completed方法。这是一种糟糕的做法。 completed方法必须采用与active相同的方法实施。

所以代码应如下所示:

var Todos = Backbone.Collection.extend({
  model: app.Todo,
  active: function() {
    return this.filter(function(todo) {
      return todo.get('completed') === false;
    });
  },
  completed: function() {
    return this.filter(function(todo) {
      return todo.get('completed') === true;
    });
  }
});

<强>更新

问:那么为什么第一次调用(使用apply)有效?

答:,因为apply方法会将this.active()结果array转换为值列表,而_.without就是这样方法。所以这个调用不同于第二个调用,它不等同于第一个调用。

但是,如上所述,这种类型的代码重用非常强烈未经推荐,因为除了双数组处理开销之外,它会掩盖代码逻辑。