2014-02-11 4 views
1

Я пишу приложение, используя магистраль + рельсы.
Приложение позволяет пользователям создавать билеты и показывать эти билеты в режиме реального времени для всех других пользователей, пользуясь услугами реального времени pusher.Синхронизирующий магистраль с толкателем

Моя проблема заключается в том, что, когда пользователь создает билет добавить его в коллекцию:

addTicket: function(newTicketData) { 
    var newTicket = new app.Ticket(newTicketData); 
    this.collection.add(newTicket, {merge: true}); 
    newTicket.save(null, { 
    wait: true, 
    success: this.addTicketSuccess, 
    error: this.addTicketError 
    }); 
}, 

Код толкатель слушателем:

channel.bind('new_ticket', function(data) { 
    var ticketDataObj = jQuery.parseJSON(data.content); 
    app.ticketsView.addTicket(ticketDataObj); 
}); 

В данный момент новая модель имеет ИДС, но не id из базы данных, которая может быть получена в обратном вызове addTicketSuccess. С другой стороны, сервер посылает сигнал толкателя в действии create, который отправляет новый билет с его id, но без id.

В результате две различные модели в коллекции, которые представляют собой один и тот же объект, один с CID и других с ID. Я знаю состояние гонки и ищу хорошее и надежное решение.

Спасибо !!!

ответ

2

cid является идентификатором клиента и никогда не отправляется на сервер.

При успешном восстановлении модели базовой линии данные, полученные с сервера, устанавливаются на один и тот же объект, не создавая другую модель.


Так что ваши вручную, добавив две модели в вашей коллекции, попробуйте удалить эту строку:

channel.bind('new_ticket', function(data) { 
    var ticketDataObj = jQuery.parseJSON(data.content); 
    // create a new method addAndMergeTicket 
    app.ticketsView.addAndMergeTicket(ticketDataObj); 
}); 

В этом новом методе, прежде чем добавить модель в коллекции, перебирать коллекцию и если вы обнаружите, что он уже существует, не добавляйте его снова

+0

Да, я знаю. Моя проблема заключается в том, что базовое приложение получает объект дважды - один раз в обратном вызове 'save', а один - через сигнал« pusher »(который, очевидно, не имеет cid). Вот почему у меня есть два объекта - один с __cid__, а другой с __id__. Важное замечание - невозможно узнать, что выполняется первым - ** сохранить обратный вызов ** или ** обратный вызов сигнала толкателя **. – guyaloni

+0

Можете ли вы уточнить свой вопрос с помощью кода толкателя? –

+0

Просто, дайте мне знать, если вам нужна дополнительная информация. – guyaloni

Смежные вопросы