7

我有一個路由器訪問其集合。我的for循環沒有遍歷模型,所以我嘗試記錄集合以查看它返回的內容。當我直接登錄集合時發現,我看到所有的模型都如預期的那樣。但是如果我嘗試記錄集合的模型屬性,我會得到一個空數組!這沒有意義。這些線路直接相互關聯。我嘗試改變順序並得到相同的結果。爲什麼backbone.js在訪問模型時返回一個空數組?

console.log(this.collection); 
=> Shots 
    _byCid: Object 
    _byId:  Object 
    length: 15 
    models: Array[15] 
    __proto__: Shots 
    ... 

console.log(this.collection.models); 
=> [] 

console.log(this.collection.length); 
=> 0 

爲什麼會發生這種情況?

下面是代碼,因爲它是在路由器給在那裏此代碼發射的一個更好的方面:

# Routers 
class Draft.Routers.Shots extends Backbone.Router 
    routes: 
    ''   : 'index' 
    'shots/:id' : 'show' 

    initialize: -> 
    @collection = new Draft.Collections.Shots() 
    @collection.fetch() 

    index: -> 
    console.log @collection 
    console.log @collection.models 
+1

抓取完成併成功重置或在您登錄時向模型添加模型? – user500198 2012-02-20 01:02:35

+0

我只能假設它是這樣做的,2個日誌是正確的,在這兩個調用之間會是一個納秒級的問題。仍然可能,但是如果你測試了幾次,它至少應該是一個不穩定的結果......它不能總是在這兩個日誌調用之間完成加載。 – Sander 2012-02-20 01:37:49

+1

我不明白爲什麼它正在記錄,但我發現我需要在視圖中的集合上添加一個事件偵聽器,以確保它已加載。 – 2012-02-20 02:40:22

回答

2

我發現我需要聽集合重置。因此,不是將模型傳遞到視圖中,而是創建另一個視圖,期望收集並偵聽「重置」事件爲視圖觸發「呈現」。

# Routers 
class Draft.Routers.Shots extends Backbone.Router 
    routes: 
    ''   : 'index' 
    'shots/:id' : 'show' 

    initialize: -> 
    @collection = new Draft.Collections.Shots() 
    @collection.fetch() 

    index: -> 
    view = new Draft.Views.Desktop(collection: @collection) 

# Views 
class Draft.Views.Desktop extends Backbone.View 
    el: $("body") 

    initialize: -> 
    @collection.on("reset",@render,this) 

    render: -> 
    console.log @collection 
    console.log @collection.length 
5

吉姆,

這不解決您的問題 - 你已經工作了這一點。但它解釋了爲什麼你看到你看到的控制檯輸出。

當你運行console.log(this)時,你輸出對象本身和控制檯鏈接引用(指針如果你喜歡)內部變量。

當你在控制檯看着它,在當時的console.log(本)運行模型區域是空的,但在當時,你看日誌,收集已完成加載模型和內部陣列變量被更新,並且對象日誌中的該變量的參考顯示當前內容。

基本上在console.log(this)中,內部模型變量會繼續它的正常生活,並且控制檯會在您查看時顯示當前狀態,而不是在您調用它時。 使用console.log(this.models),數組按原樣轉儲,不保留任何引用,並且所有內部值都被逐個轉儲..

該行爲非常簡單,看到這個小提琴.. http://jsfiddle.net/bendog/XVkHW/

+0

謝謝!這真的很有趣,很有可能在未來知道。那裏我真的很困惑。 – 2012-02-20 04:02:21

+0

@JimJeffers。不用擔心,高興地帶來一些光線,我經歷過同樣的困惑...... :) – Ben 2012-02-20 05:20:03

0

您可以使用承諾。 (.done會做得很好)

@collection.fetch().done => 
    for model in @collection.models 
    console.log model 

這會給你@收集的模型中取出,並準備去。

,或者如果你不需要強制應用程序等待,

@collection.on 'sync', => 
    for model in @collection.models 
    console.log model 

這兩個會讓你做你想做的。

相關問題