2012-03-07 57 views
14

有人構建應用爲我們,爲我提供的代碼,所以我可以通過它, 我注意到了這一點,起初看起來不錯,甚至好的讓集合管理他的數據 但過了一會兒,我開始在這個想法Backbone.js的取收集從它的初始化方法

這樣想着可能的陷阱: 是從它自己的initialize方法獲取一個集合的數據是個好習慣。

例如:

var Book = Backbone.Model.extend({}); 

var Books = Backbone.Collection.extend({ 

    url: '/books', 

    initialize: function(){ 
     // do some logic here 

     // if collection is empty, fetch from server 
     if(this.size() == 0) 
      this.fetch(); 
    } 

}); 

我問這個,因爲我覺得它可能是在下列情況下一個問題:

假設我們是在一個routeAction:

books: function() { 
    var books = new Books(); 
    var bookList = new BookList({ collection: books }); 
} 

ISN」 t這種情況可能失敗,如果提取比視圖的初始化更快,視圖會綁定到重置事件,那麼重置會在觸發之前觸發視圖的初始化已被執行?

我錯了這一點,或者我應該提交票證以修復此問題。

回答

21

雖然在實踐之前fetch()完成將最有可能發生的視圖的初始化(你會綁定到render()resetinitialize())這是一個非常糟糕的主意依靠異步操作的順序反正。換句話說,您的代碼應該以使訂單無關的方式編寫。

我見過fetch()被稱爲initialize()各種項目。我仍然認爲這是不理想和不好的做法。當你需要時明確提取也有這些優點:

  1. 你可以做到這一點,當你需要,而不是每次你創建一個新的集合。

    例如,可以初始化你的觀點,一旦你要取只渲染:

  2. ,如果你願意,你可以做爲了某些事情。

    var bookList, books = new Books(); 
    var p = books.fetch(); 
    p.done(function() { 
        bookList = new BookList({collection: books }); 
        bookList.render(); 
    }); 
    
  3. 它使測試更容易。

+0

感謝您的洞察力,我會要求他相應地編輯代碼。你是對的幾點,雖然我相信他的情況下,目前的應用程序只創建1個集合,所以每次創建集合時加載並不是一個問題,但我可以看到它應該是一個問題,當應用程序正在在明年晚些時候的版本2或3中,可能會添加其他集合。 – Sander 2012-03-07 18:14:18

+0

正如你暗示你的問題,這是一個使用正確方法的問題。在'initialize'內部讀取不會產生錯誤。這是無效的,醜陋的,*原則上*錯誤。 – ggozad 2012-03-07 18:22:08

+0

@ mu-is-too-short謝謝!我花了20分鐘試圖找出列表中的代碼塊並失敗。我很想念我的... ... – ggozad 2012-03-07 18:24:06