使用Backbone.js加载模型关系

时间:2012-02-11 21:18:45

标签: ruby-on-rails rest model backbone.js relationship

我正在使用Rails REST后端编写我的第一个Backbone.js应用程序,令我困惑的一件事是模型之间的关系。

我正在撰写的这款应用会以TicketClient为模型。我也设置了TicketsClients个收藏集。

事实证明我有几千个客户,我不想将它们加载到内存中,相反,当机票引用时,我想懒得加载客户。

我尝试过一种非常天真的方法,显然不起作用,因为Model#fetch()方法是异步的。

到目前为止,这是我的Ticket模型(在 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()函数总是返回“undefined undefined”,因为在调用时fetch没有返回。

处理这种数据关系的正确方法是什么?请注意,我不介意你退后一步,说我使用了错误的方法并建议我做些什么。

任何指针,文章或其他任何内容都将不胜感激。

1 个答案:

答案 0 :(得分: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);
}