我有一个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