У меня есть приложение Rails 3.2, к которому я начал прикреплять множество привязок knockout.js. Я хотел бы отправить форму в формате JSON на мой сервер Rails.Rails представляет форму через knockout.js
У меня есть форма сделки, которая имеет объем
= form_for(@tran, :html => {"data-bind" => "submit: submitTrans"}) do |f|
.field
= f.label :date
= f.date_select :date
.field
= f.label :voucher
= f.number_field :voucher
.field
= f.label :amount
= f.text_field :amount, "data-bind" => "value: amount, valueUpdate: 'afterkeydown', style: { background: amount() == 0 ? 'red' : 'white' }"
.field
= f.label :tax
= f.text_field :tax, "data-bind" => "value: tax"
.actions
= f.submit 'Save'
Вот мой Нокаут код:
#= require knockout
TranViewModel = ->
# Observables
self.amount = ko.observable("0")
# Computed values
self.tax = ko.computed(
read: -> (self.amount()/10).toFixed 2
write: (value) -> value
owner: this)
tranViewModel = new TranViewModel()
# Submit through AJAX
self.submitTrans = (formElement) ->
alert ko.toJSON(tranViewModel)
# Apply keybindings on page load
$(document).ready (event) ->
ko.applyBindings(tranViewModel)
Когда я использую ko.toJSON, как это я получаю «не определено», возвращенное в мой бокс.
Должен ли я создать экземпляр моей модели? Как мне получить все атрибуты формы в формате JSON и отправить их в мой маршрут/транзакцию rails?
Документация Нокаут описывает функцию pushJSON но страница больше не существует: http://knockoutjs.com/documentation/submit-binding.html
Update # 1
Я попытался вручную отправки JSON, и это позволило мне создать объект
self.submitTrans = (formElement) ->
json = JSON.parse('{"tran": {"amount": "9999"}}')
$.post("/trans", json, (returnedData) ->
alert returnedData)
Update # 2
Я попробовал несколько вещей, чтобы получить свою форму в формате JSON для представления с помощью $ .post
self.submitTrans = (formElement) ->
json = ko.toJSON(tranViewModel)
$.post("/trans", json, (returnedData) ->
alert returnedData)
Это возвращается как неопределенные. Что я передаю в ko.toJSON?
Update # 3
Я попробовал пример с сайта выбывание:
viewModel =
firstName : ko.observable("Bert"),
lastName : ko.observable("Smith"),
pets : ko.observableArray(["Cat", "Dog", "Fish"]),
type : "Customer"
self.submitTrans = (formElement) ->
json = ko.toJSON(viewModel)
$.post("/trans", json, (returnedData) ->
alert returnedData)
Это правильно форматирует ViewModel как JSON. Это связано с тем, что viewModel является объектом, а не функцией. Если я, однако, изменю свой TranViewModel от функции к объекту, это сломает много моих привязок. Каков правильный способ настройки привязок? Должны ли они находиться в объекте или функции?
Update # 4
Мои примеры: jsfiddle.net/p6Vcc/3 - При нажатии представляет в ko.toJSON не собирает все formElements, я должен быть наблюдаемым при добавлении всех моих полей?
jsfiddle.net/p6Vcc/4 - тот же пример, что и предыдущий, кроме перекодированного в coffeescript, теперь, когда при нажатии на него отображается только фамилия клиентов и ни одно другое поле.
Я обновил jsfiddle, http://jsfiddle.net/p6Vcc/3/ Проблема заключается в том, когда вы нажмете кнопку 'Отправить' в моем примере это отсутствует содержание электронной почты. Нужно ли добавлять каждое поле в качестве наблюдаемого? – map7
Также я использую скрипт для кофе и заметил, что есть проблема при использовании knockout.js и coffeescript. Принимая тот же пример и преобразовывая его в coffeescript http://jsfiddle.net/p6Vcc/4/, теперь мы получаем «Смит» как результат вместо ожидаемого вывода JSON. – map7
Я добавил ответ с фиксированным coffeescript –