我有一个 Rails 3.2 应用程序,我已经开始附加很多 knockout.js 绑定。我想将 JSON 格式的表单提交到我的 Rails 服务器。
我有一个有金额的交易表格
= 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 route '/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 以便使用 $.post 提交
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)
这会正确地将 viewModel 格式化为 JSON。这是因为 viewModel 是一个对象而不是一个函数。但是,如果我将我的 TranViewModel 从一个函数更改为一个对象,这会破坏我的很多绑定。哪种是设置绑定的正确方法?它们应该在对象还是函数中?
更新#4
我的示例:jsfiddle.net/p6Vcc/3 - 单击提交时,ko.toJSON 不会收集所有 formElements,我应该向所有字段添加 observable 吗?
jsfiddle.net/p6Vcc/4 - 与前面的示例相同,除了在咖啡脚本中重新编码,现在单击提交时,它只显示客户的姓氏,而没有其他字段。