2012-02-11 50 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