2013-10-14 34 views
0

我正在使用Coffeescript的Backbone。我用我的觀點的代碼是:奇怪的行爲在使用sortby與Backbone/Coffeescript

initialize: -> 
     @collection.on "reset", @render, @ 
     @collection.fetch({reset: true}) 

    render: -> 
     @collection = @collection.sortBy (item) -> item.get('name') 
     @collection.forEach @renderEntry, @ 
     @ 

    renderEntry: (model) -> 
     v = new App.Views.EntryView({model: model}) 
     @$el.append(v.render().el) 

問題是,當我想骨幹收集上的第一線分類渲染功能我得到遺漏的類型錯誤:對象[對象數組]有沒有方法「 sortBy'錯誤。如果我改變渲染功能,並將其改寫爲:

render: -> 
     sorted = @collection.sortBy (item) -> item.get('name') 
     sorted.forEach @renderEntry, @ 
     @ 

然後一切正常。原始代碼有什麼問題?

我試圖將排序功能移動到另一個功能,沒有任何改變。再次,當我想分配集合本身收集到同樣的錯誤。

任何想法?

在此先感謝。

+0

sortBy返回一個數組而不是實際的集合。因此排序是一個數組而不是Backbone.Collection。我猜你正在嘗試使用Array來對抗集合本身。所以當你嘗試求助時,你的@collection會拋出一個錯誤,因爲它不再是Backbone.Collection。檢查此[回答](http://stackoverflow.com/questions/18010714/backbone-collection-sortby) – TYRONEMICHAEL

+0

問題不在於收集。如果我嘗試將sortBy的結果賦給集合本身,我會得到這個錯誤,但是如果我將結果賦值給另一個變量,就像之前提到的那樣,一切正常,JS不會拋出運行時錯誤。其實問題出現在「=」符號的右側,當我改變左側時,一切都很順利。相當困惑! –

回答

0

解決!

問題是,重置事件被觸發兩次。一個由骨幹,第二次通過獲取。所以,第一次,我打電話

@collection = @collection.sortBy (item) -> item.get('name') 

它取代了收集與空數組(因爲沒有被取出還),因此不存在sortBy方法,它在未來的運行被調用。

與更換行:

(@collection = @collection.sortBy (item) -> item.get('name')) if @collection.length > 0 

解決了這個問題。