1

今天遇到了虹吸障碍。

对于特定用例,它似乎无法处理将表单值序列化为 JSON:一组复选框,每个复选框都有一个单独的值,但名称都相同。

<input type="checkbox" name="cats" value="Whiskey">
<input type="checkbox" name="cats" value="Tango">
<input type="checkbox" name="cats" value="Cash">

我覆盖了复选框阅读器,为我提供了复选框的值:

Backbone.Syphon.InputReaders.register('checkbox', function(el){
        return el.val();  //fetch value not the boolean
    });

现在我得到了最后一个选定的值,而不是预期的所有选定值的数组。

有没有人处理过这个?

4

2 回答 2

5

经过几个小时的努力,我有了一些发现:

  1. API 文档和带注释的代码库与我下载的实际最新代码不匹配。事实上,它有很大的不同。

  2. 检查键(输入的名称属性)以确定如何序列化它的数据。

因此,有了这些知识,我能够通过执行以下 3 件事将我的复选框值作为值数组获取:

  1. 注册特定于复选框的输入阅读器以返回值属性。
  2. 注册复选框验证器以仅从复选框中收集值。
  3. 将括号附加到 name 属性以指示数组输入。

.

 Backbone.Syphon.InputReaders.register('checkbox', function (el) {
    return el.val();
 });

 Backbone.Syphon.KeyAssignmentValidators.register("checkbox", function ($el, key, value) {
    return $el.prop("checked");
 });

<input type="checkbox" name="cats[]" value="Whiskey">
<input type="checkbox" name="cats[]" value="Tango">
<input type="checkbox" name="cats[]" value="Cash">
于 2013-08-15T06:12:35.447 回答
0

dbrin 的答案的一个问题是普通复选框(而不是数组)会受到影响,因此您在选中输入时会得到字符串值“on”,而在未选中输入时会得到布尔值false。我找到了这个解决方案:

Backbone.Syphon.InputReaders.register('checkbox', function ($el) {
  return ($el.attr('name').endsWith('[]')) ? $el.val() : $el.prop("checked");
});

Backbone.Syphon.KeyAssignmentValidators.register("checkbox", function ($el, key, value) {
  return ($el.attr('name').endsWith('[]')) ? $el.prop("checked") : true;
});
于 2014-11-18T11:29:07.453 回答