我想使用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());
答案 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
就是这样方法。所以这个调用不同于第二个调用,它不等同于第一个调用。
但是,如上所述,这种类型的代码重用非常强烈未经推荐,因为除了双数组处理开销之外,它会掩盖代码逻辑。