在jQuery的.each()中的函数完成之后,如何使函数返回true?

时间:2014-01-09 13:36:56

标签: javascript jquery knockout.js each

我正在使用knockout.js。我在表单中有几个可编辑的网格,这些网格中的字段名称很重要,因此使用uniqueName不是一个选项。

所以我正在做的是在用户点击提交时调用一个函数来重命名字段。

function renameFields(o, index) {
  var el_name    = $(o).attr('name');
  var name_index = el_name.lastIndexOf('_') + 1;

  $(o).attr('name', el_name.substring(0, name_index) + index);
}

function Submit() {
  self.submit = function() {
    // Use unique AND meaningful input/textarea [name]s in .grids.
    window.index_arr = [];

    $('.grid').each(function() {
      $(this)
      .children('.row')
      .each(function(i){
        window.index_arr.push(i);

        $(this)
        .find('input, textarea')
        .each(function() {
          renameFields($(this), window.index_arr[i]);
        })
      })
    });

    // Submit the form
    return true;
  }
}

renameFields工作正常,但在每个字段调用之前都会返回true

2 个答案:

答案 0 :(得分:2)

让Knockout做一些肮脏的工作,让你的属性索引保持最新状态:

HTML:

<div id="grid" class="grid">
    <div class="row" data-bind="foreach:rows">
        <input data-bind="attr: { name: 'string_' + $index() }">
        <textarea data-bind="attr: { name: 'string_' + $index() }">
    </div>
</div>

查看型号:

var vm = {
    rows: ko.observableArray()
};

ko.applyBindings(vm, document.getElementById("grid"));

答案 1 :(得分:0)

请向我们提供有关如何设置点击处理程序的更多信息......

我会选择一个SWAG ...我认为你正在处理hoisting

没有小提琴我无法测试,但请尝试以下代码。

var renameFields = function(o, index) {
  var el_name    = $(o).attr('name');
  var name_index = el_name.lastIndexOf('_') + 1;

  $(o).attr('name', el_name.substring(0, name_index) + index);
}

var Submit = function() {
  self.submit = function() {
    // Use unique AND meaningful input/textarea [name]s in .grids.
    window.index_arr = [];

    $('.grid').each(function() {
      $(this)
      .children('.row')
      .each(function(i){
        window.index_arr.push(i);

        $(this)
        .find('input, textarea')
        .each(function() {
          renameFields($(this), window.index_arr[i]);
        })
      })
    });

    // Submit the form
    return true;
  }
}