【问题标题】:checkbox form field name is not submitted when form submits knockout js表单提交淘汰js时未提交复选框表单字段名称
【发布时间】:2016-03-29 15:21:29
【问题描述】:

当用户提交表单时,我试图获取所有表单字段,问题在于复选框字段,即当复选框被选中时,名称是提交到服务器,但如果未选中,则复选框不会提交到服务器,我正在使用淘汰赛最新版本这是我的工作代码:

<form data-bind="submit: submitForm">
    <input type="checkbox" name="checkboxTest" data-bind="checked : value" />
    <input type="text" name="textTest" value="Test" />
    <button type="submit"> Submit</button>
</form>

这是我的 ViewModel:

function viewModel(data)
    {
        self.value = ko.observable(true);
        // when user submit the form
        self.submitForm =  function(fields)
        {
            var dataparams = $(fields).serialize();
            // The form fields name are showing here
            console.log(dataparams);
        }
    }
    ko.applyBindings(new viewModel);

任何人都可以告诉我如何获取复选框,即使使用 knockoutjs 未选中该复选框,提前谢谢。

【问题讨论】:

  • viewModel 维护一个更新的value observable。不是提交虚拟机的选项吗?
  • 我没听明白,你能再澄清一下吗?
  • 提交时,服务器是否可以改为接受JSON?如果是这样,发送 viewmodel 数据会更容易,而不是序列化整个表单
  • 是的。我需要json形式。你能写一些代码吗?

标签: javascript jquery forms checkbox knockout.js


【解决方案1】:

jQuery 将表单内的成功控件序列化。只有“成功的控件”才会序列化为字符串。来自checkboxes 和radio buttons 的值(“radio”或“checkbox”类型的输入)仅在它们被选中时才包含在内,这是有意义的,因为它们是布尔状态。如果你想在你的对象中有所有输入,你可以手动添加它们。或者如果你想在你的数据库中存储true 或false 的值,而不是使用checkbox,你可以使用&lt;select&gt; 与0 和1 的值(是,否)

【讨论】:

  • 感谢您的回答,但我无法手动添加它们,因为我有一个表单,我已经为用户提供了添加更多表单字段的选项,在这种情况下,如果我有 20 个复选框表单字段我必须维护一个数组来跟踪它们的值,但这不是优化解决方案,我需要一些东西来让所有表单字段成功或不成功。
【解决方案2】:

这是一个例子:

HTML:

<form data-bind="submit: submitForm, with: form">
  <input type="checkbox" name="checkboxTest" data-bind="checked : value" />
  <input type="text" name="textTest" value="Test" />
  <button type="submit"> Submit</button>
</form>

JS:

function viewModel() {
  this.value = ko.observable(true);
}

function parentViewModel() {
  var self = this;

  self.form = ko.observable();

  // when user submit the form
  self.submitForm = function() {
    var dataparams = ko.toJSON(self.form);
    // The form fields name are showing here
    console.log(dataparams);
  };
}

var vm = new parentViewModel();
vm.form = new viewModel();

ko.applyBindings(vm);

然后您应该以 JSON 格式获取属性。在这种情况下,{"value": true} 或 {"value": false}

Working example

【讨论】:

  • 谢谢@Neps,但是其他表单字段呢,因为用户将动态添加更多表单字段,例如输入字段,复选框等。我怎样才能让所有其他字段都驻留在当前表单标签。
  • 您可以将 observables 添加到 viewModel 并将它们绑定到相应的字段。
  • 不,我不能这样做,因为表单字段来自 json 格式的服务器,例如 {"name": "Text Box", "type": "text", "value": “”},{“名称”:“复选框”,“类型”:“复选框”,“值”:true},{“名称”:“日期字段”,“类型”:“日期”,“值” :"2016-03-29 07:00:00"},它会变得复杂,因为我无法跟踪有多少字段来自数据库并为每个字段保留 observables。
猜你喜欢
  • 2013-01-21
  • 1970-01-01
  • 2020-06-07
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2012-05-23
  • 2014-10-31
相关资源
最近更新 更多