Отправьте POST ajax, чтобы добавить продукты в предложение

Мой опыт больше связан с сервером, чем с интерфейсом. Так что мне может не хватать некоторых базовых знаний о внешнем интерфейсе.

У меня есть конечная точка под названием

/quotations/:id/products

что, если вы выполняете действие POST, это означает, что вы хотите добавить продукты в указанное предложение, где :id представляет собой идентификатор предложения.

В моей схеме цитаты и продукты имеют отношения «многие ко многим».

Конечная точка также ожидает, что данные отправляются в форме products[].

То есть если я хочу добавить товары с id 2, 7 и 154 в котировку 3

Я ОТПРАВЛЯЮ

<input name="products[]" value="2" />
<input name="products[]" value="7" />
<input name="products[]" value="154" />

на адрес /quotations/3/products

Мой вопрос: как мне создать модель и представление с помощью Backbone для этой настройки?

Я купил книгу Эдди Османи о разработке приложений Backbone.js. Итак, я настроил свою основу аналогично его пример.

Существует только пример прямой модели добавления.

Надеюсь, я получу ответ, соответствующий соглашению Османи о добавлении дочерних элементов к родительскому типу поведения.

Османи также упомянул о реляционной магистрали.

Я не уверен, должен ли я использовать это или даже как. Я прочитал документацию, но не знаю, как это вписать в то, как Османи структурировал свои примеры приложений Backbone.

ОБНОВЛЕНИЕ:

В случае успеха я хочу, чтобы страница перенаправлялась на другую страницу с именем /success.

Если это сбой, я хочу, чтобы на странице где-то отображалось сообщение об ошибке. Предположим, что мне нужно обновить <div id="message"></div>.

Другими словами, в случае сбоя страница остается одностраничным приложением.

В случае успеха страница переходит на другую страницу.

Что касается кода на стороне сервера для возврата ответов JSON и т. д., я могу сделать это без проблем. Предположим, я использую PHP.


person Kim Stacks    schedule 19.02.2013    source источник
comment
Вы отправляете ввод формы как строку запроса или как JSON? Если вы можете изменить свой код на стороне сервера, чтобы он возвращал JSON, вы должны также изменить его, чтобы он принимал JSON, если он уже не принимает.   -  person jevakallio    schedule 02.03.2013


Ответы (1)


Недавно я столкнулся с подобной проблемой, я не могу сказать вам наверняка, что это лучший способ сделать это, но я обнаружил, что это работает надежно. Я попробовал BackboneRelational, но у меня возникли проблемы с ним.

Это предполагает, что вам нужно будет создать объект Quote и ProductQuotation за 1 шаг.

  • Настройте представление для новой цитаты

  • При инициализации этого представления:

    A) Создайте новую пустую модель Quote

    Б) Создать новую коллекцию для ProductQuotes

    C) Создайте новое представление ProductQuote для каждого добавляемого ProductQuote.

    D) Подпишите представление Quote на пользовательскую привязку события Backbones (Backbone JS: может ли одно представление запускать обновления в других представлениях?), т.е.

    Backbone.pubSub.on('quote_new-product-save', this.AddProduct, this)

    Это представление теперь будет вызывать AddProduct каждый раз, когда вы инициируете это событие.

  • При инициализации каждого представления ProductQuote создайте новую модель продукта.

  • Подключите это представление, чтобы ваш пользователь мог заполнить любую применимую информацию, и когда они закончат, установите эту информацию для этой модели продукта и вызовите событие «quote_new-product-save», упомянутое выше, и передайте ему эту модель продукта.

  • Вернувшись в представление Quote, AddProduct будет автоматически вызван, поскольку он был привязан к этому событию. Вы должны связать это, чтобы получить новую модель продукта и добавить ее в коллекцию ProductQuotes.

  • Итак, теперь у вас есть данные модели вашего продукта, установленные в вашей коллекции ProductQuotes, но они по-прежнему не связаны напрямую с текущим Quote (который до сих пор не был сохранен), поэтому установите атрибут «order_items» в вашей модели для всех моделей в вашей коллекции ProductQuotes. то есть

    this.model.set('product_quotes', this.collection.models)

Теперь в вашей несохраненной модели Quote все элементы коллекции ProductQuotes будут установлены в качестве атрибута.

Теперь вам нужно вызвать сохранение модели Quote и отправить данные на сервер. Здесь следует помнить, что ваш urlRoot настроен правильно и что данные, отправляемые на сервер, правильно отформатированы. Я рекомендую прочитать Сохранение вложенные объекты с Rails, backbone.js и accepts_nested_attributes_for о переопределении метода toJSON в вашей модели Quote.

person Brent    schedule 07.03.2013