1

我有一个简单的表单输入列表,它们是可排序的,用户可以向表单添加更多行。

名称属性相当简单:

field_id_3[0][options][html_data]
field_id_3[1][options][html_data]
field_id_3[2][options][html_data]

我有一个相当简单的 updateindexes 方法,如下所示:

$container.find('.' + opts.rowClass).each(function(rowCount) {

  regex = /^(.*)\[(?:[0-9]+)\](.*)$/;

  $(this).find('input, select, textarea').each(function(fieldCount) {
    $field = $(this);
    if ($field.attr('name')) {
      var fieldName = $field.attr('name').replace(regex, '$1[' + rowCount + ']$2');
      $field.attr('name', fieldName);
    }
  });
});

这一切似乎都运行良好,但现在我需要引入新元素,这些元素也是可排序和嵌套的。我现在正在编写第二个 updateindexes 方法,它只处理嵌套索引。

名称属性沿线

field_id_3[0][options][html_data]
field_id_3[1][options][html_data]
field_id_3[2][options][list_items][0][item]
field_id_3[3][options][list_items][1][item]
field_id_3[4][options][html_data]

我坚持的是修改正则表达式模式,以便第一个数组索引的替换和任何第二个数组索引在两个更新索引方法中相互独立。

如何使用正则表达式独立定位第一个 [key] 属性和第二个 [key] 属性?

谢谢

4

1 回答 1

1

这是与您要求的方法略有不同的方法,其中工作函数根据传递给它的参数重新编号所有索引。

这是工人功能:

var indexFinder = /\[(?:[0-9]+)\]/g; //defined once to give reIndex() a little less work to do.

function reIndex(str) {
    str = str.replace(indexFinder, '[]');
    for(var i=1; i<arguments.length; i++){
        str = str.replace('[]', '['+arguments[i]+']');
    }
    return str;
}

演示

接下来的挑战是设计一个循环结构,从中调用 reIndex()。

假设 list_items 被分组在合适的容器中,可能是这样的:

var itemGroupSelector = '.itemGroup'; //or similar
var fieldSelector = 'input, select, textarea';

$container.find('.' + opts.rowClass).each(function(rowCount, row) {
    var $row = $(row);
    $row.find(fieldSelector).each(function(i, field) {
        $field = $(field);
        if ($field.attr('name')) {
            var fieldName = reIndex($field.attr('name'), rowCount);
            $field.attr('name', fieldName);
        }
    });

    $row.find(itemGroupSelector).each(function(itemCount, itemGroup) {
        $(itemGroup).find(fieldSelector).each(function(i, field) {
            $field = $(field);
            if ($field.attr('name')) {
                var fieldName = reIndex($field.attr('name'), rowCount, itemCount);
                $field.attr('name', fieldName);
            }
        });
    });
});

还有一些工作要做,但我相信这可以发挥作用。

于 2012-10-28T06:44:29.540 回答