2012-02-11 47 views
3

我正在用Rails REST後端編寫我的第一個Backbone.js應用程序,而令我困惑的一件事是模型之間的關係。加載與Backbone.js的模型關係

我寫的這個應用程序將有TicketClient作爲模型。我也設置了TicketsClients集合。

事實證明,我有幾千個客戶,我不想將它們加載到內存中,而是我希望在票據引用它時懶惰地加載客戶。

我試過一種非常幼稚的方法,顯然不起作用,因爲Model#fetch()方法是異步的。

這裏是我的票務模式到目前爲止(在的CoffeeScript):

class Deputy.Models.Ticket extends Backbone.Model 

    initialize: -> 
     @fetchClient() 

    fetchClient: -> 
     @client = new Deputy.Models.Client() 
     @client.set id: @get('userid') 
     @client.fetch() 

    clientName: -> 
     first = @client.get('firstname') 
     last = @client.get('lastname') 
     "#{first} #{last}" 

正如你可以想像,在clientName()函數總是返回「未定義未定義」,因爲取不返回調用時。

處理這種數據關係的正確方法是什麼?請注意,我不介意你退後一步說我正在使用錯誤的方法,而是給我一些建議。

任何指針,文章,或任何其他將不勝感激。

回答

5

client.fetch()接受一個success選項,完成後將被解僱。當您啓動fetchClient時,您應該添加加載UI(可能與使用旋轉圖標替換按鈕一樣簡單)以及客戶端完成加載後繼續顯示名稱。

在JavaScript中,你會做這樣的事情:

fetchClient: function() { 
    var client = new Deputy.Models.Client(); 
    client.set({ id: this.get('userid') }); 
    client.fetch({ success: this.fetchClientSuccess }); 
    // Or maybe the following depending on how you set up your code. 
    // client.fetch({ success: Deputy.Models.fetchClientSuccess }); 
}, 

fetchClientSuccess: function(lead, response) { 
    Deputy.Models.clientName(lead); 
} 
+0

感謝您的答覆。然而,'Deputy.Models.clientName(lead)'是做什麼的,它來自哪裏? – kolrie 2012-02-12 01:45:52

+0

沒關係,我明白了! – kolrie 2012-02-12 01:48:24