2014-10-05 34 views
0

我想用_.without方法过滤Backbone collection为什么'不'方法根据上下文返回不同的结果?

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

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()); 

回答

2

问题是您使用Undersore的without方法不当。它预计标量值为第二个参数,而您通过array。其实你根本不需要_.without

不要尝试在completed方法中重用您的active方法。这是一个不好的的做法。方法必须通过与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; 
    }); 
    } 
}); 

UPDATE:

问:那么,为什么第一次调用(使用apply)的作品?

一个:由于apply方法转换this.active()的结果,这是array,到的值的列表,这是通过精确地方法_.without预期。所以这个调用与第二个调用不同,它不等同于第一个调用。

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

+0

但是如果_a没有在第一种形式的调用中工作,如果它期望一个标量值? this.without。apply(this,this.active()) – yaru 2014-10-05 13:17:58

+0

>这是一个不好的习惯为什么这样?这是一个代码重用。 DRY原则。 – yaru 2014-10-05 13:19:03

+0

_为什么这样?这是一个代码重用_不适合你的情况 – hindmost 2014-10-05 13:19:50

相关问题