1

ソート可能な単純なフォーム入力のリストがあり、ユーザーはフォームに行を追加できます。

name 属性はかなり単純です。

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);
    }
  });
});

これはすべてうまくいくように見えますが、ソート可能でネストされた新しい要素を導入する必要があります。現在、ネストされたインデックスのみを処理する 2 番目の updateindexes メソッドを作成しています。

name 属性は、

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]

私が立ち往生しているのは、最初の配列インデックスの置換と2番目の配列インデックスが2つの更新インデックスメソッドで互いに独立するように正規表現パターンを変更することです。

最初の [キー] 属性と 2 番目の [キー] 属性を正規表現で個別にターゲットにするにはどうすればよいですか?

ありがとう

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 に答える