我有一個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路由'/ transaction'中?
淘汰賽文檔描述了pushJSON的功能,但該網頁不存在了: http://knockoutjs.com/documentation/submit-binding.html
更新#1
我試圖手動發送的JSON,這讓我創建一個對象
self.submitTrans = (formElement) ->
json = JSON.parse('{"tran": {"amount": "9999"}}')
$.post("/trans", json, (returnedData) ->
alert returnedData)
更新#2
我嘗試了一些事情,讓我的形式進入JSON使用提交$。員額
self.submitTrans = (formElement) ->
json = ko.toJSON(tranViewModel)
$.post("/trans", json, (returnedData) ->
alert returnedData)
這回來爲未定義。我通過什麼傳遞給ko.toJSON?
更新#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)
這正確格式視圖模型爲JSON。這是因爲viewModel是一個對象而不是函數。但是,如果我將TranViewModel從一個函數更改爲一個對象,這會打破我的很多綁定。這是設置我的綁定的正確方法?他們應該是在一個對象或功能?
更新#4
我的例子: jsfiddle.net/p6Vcc/3 - 當點擊提交ko.toJSON不能收集所有formElements,我應該是增加可觀測到我的所有領域?
jsfiddle.net/p6Vcc/4 - 除了在coffeescript中重新編碼之外,與之前的示例相同,現在單擊提交時只顯示客戶的姓氏,而沒有其他字段。
我更新了的jsfiddle,http://jsfiddle.net/p6Vcc/3/問題是,當你打在我的例子中, '提交' 按鈕,它缺少電子郵件內容。我是否必須將每個字段添加爲可觀察的? – map7 2012-04-27 00:58:21
另外,我使用咖啡腳本,並注意到使用knockout.js和coffeescript時存在問題。採取相同的例子,並將其轉換爲咖啡腳本http://jsfiddle.net/p6Vcc/4/現在我們得到「史密斯」作爲輸出,而不是預期的JSON輸出。 – map7 2012-04-27 01:03:50
我添加了一個固定的咖啡腳本的答案 – 2012-04-27 14:01:55