我正在使用Rails REST后端编写我的第一个Backbone.js应用程序,令我困惑的一件事是模型之间的关系。
我正在撰写的这款应用会以Ticket
和Client
为模型。我也设置了Tickets
和Clients
个收藏集。
事实证明我有几千个客户,我不想将它们加载到内存中,相反,当机票引用时,我想懒得加载客户。
我尝试过一种非常天真的方法,显然不起作用,因为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没有返回。
处理这种数据关系的正确方法是什么?请注意,我不介意你退后一步,说我使用了错误的方法并建议我做些什么。
任何指针,文章或其他任何内容都将不胜感激。
答案 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);
}