Backbone Relational и subviews, лучшая стратегия сохранения

Я использую Backbone-relational следующим образом:

class window.Car extends Backbone.RelationalModel

class window.Person extends Backbone.RelationalModel
    relations: [{
        type: Backbone.HasOne
        key: 'car'
        relatedModel: Car
    }]

Существует также PersonView, который включает в себя подпредставление CarView.

Теперь мой вопрос: какова наилучшая стратегия, когда пользователь нажимает «Сохранить» в PersonView? Проблема в том, что save произойдет в два этапа, сначала автомобиль, а затем человек. Но что, если проверка не проходит с человеком? Это отменит сохранение, но машина уже будет сохранена!

Может быть, Backbone-relational здесь не лучший вариант? Любая альтернатива?

В общем, я все больше и больше разочаровываюсь в том, что Backbone не очень хорошо работает с глубоко встроенными документами (я использую MongoDB). Да, приложение Todo — это хорошо, но реальный мир сложнее! Любое руководство или учебник будет очень признателен.


person Blacksad    schedule 25.02.2012    source источник


Ответы (2)


Трудно ответить, не зная деталей, но уверены ли вы, что вам нужны реляционные модели на стороне браузера?

Backbone предназначен для спокойных приложений. Является ли ваш API на стороне сервера спокойным?

В вашем случае (и не совсем понимая ваши ограничения) я могу подумать о следующей реализации.

На сервере API следующих URI:

[…]/carType/{carType}
[…]/persons/{person}
[…]/cars/{car}

В этой реализации «car» представляет реальный физический объект, где «carType» представляет класс автомобиля. Базовая модель для «автомобиля» содержит идентификатор «carType» и идентификатор «человека». Существуют также базовые модели для «carType» и «person». Таким образом, когда вы хотите связать «человека» и «тип автомобиля», вы создаете новый «автомобиль» и выполняете POST на сервер. Поскольку «автомобиль» является самостоятельным независимым объектом (и имеет собственный URL-адрес), вы можете работать с ним в транзакционном режиме (это то, о чем, я думаю, вы спрашиваете).

Я надеюсь, что это поможет, и ответ не очень далек от того, что вы на самом деле пытаетесь сделать.

person Robert    schedule 01.03.2012

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

Для этого в Backbone-relational реализована отличная поддержка сериализации и десериализации вложенных объектов.

person Paul    schedule 16.03.2012