2012-02-11 2 views
3

Я пишу свое первое приложение Backbone.js с бэкэндом Rails REST, и одна вещь, которая меня озадачивает, - это отношения между моделями.Загрузка отношений модели с Backbone.js

Это приложение, которое я пишу, будет иметь Ticket и Client в качестве моделей. Я также установил как Tickets, так и Clients.

Оказалось, что у меня есть несколько тысяч клиентов, и я бы не хотел их загружать в память, вместо этого я хотел бы лениво загрузить клиента, когда билет ссылается на него.

Я пробовал очень наивный подход, который, очевидно, не работает, потому что метод 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, вы должны добавить загрузочный интерфейс (может быть что-то такое же просто, как заменить кнопку со щелчком), а когда клиент закончит загрузку, продолжите отображение имени.

В 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

Спасибо за ответ. Однако что делает 'Vice.Models.clientName (lead)' точно и откуда оно взялось? – kolrie

+0

Ничего, я понял! – kolrie