使用Backbone.js加载模型关系

kol*_*rie 3 rest model ruby-on-rails relationship backbone.js

我正在使用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}"
Run Code Online (Sandbox Code Playgroud)

可以想象,该clientName()函数始终返回"undefined undefined",因为在调用时fetch没有返回.

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

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

abr*_*ham 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);
}
Run Code Online (Sandbox Code Playgroud)