2014-10-05 33 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

相關問題