0

我想向给定的 Rails 4 表单添加一个新的嵌套元素。

咖啡脚本:

ready = ->
  $('form').on 'click', '.add_comment', (event) ->
    new_fields = $(this).parent().prev('div.field').clone()
    new_fields.insertBefore('p.new_comment_link')
    event.preventDefault()

$(document).ready(ready)
$(document).on('page:load', ready)

在我这样做之前,insertBefore我想更改new_fields. 的内容new_fields是:

<div class="field">
  <label for="post_comments_attributes_2_name">Name</label><br>
  <input id="post_comments_attributes_2_name" name="post[comments_attributes][2][name]" type="text">
  <input id="post_comments_attributes_2__destroy" name="post[comments_attributes][2][_destroy]" type="hidden" value="false">
  <a class="remove_category" href="#">remove</a>
</div>

在不知道 [2] 是 2 的情况下,如何[2]用 +1 ( ) 替换所有内容?[3]它可以是任何整数。

4

2 回答 2

1

您可以使用.replace()回调函数:

'[1] [2]'.replace /\[(\d+)\]/g, (match, num) ->
    return "[#{parseInt(num, 10) + 1}]"

和 JavaScript 等价物:

'[1] [2]'.replace(/\[(\d+)\]/g, function(match, num) {
    return '[' + (parseInt(num, 10) + 1) + ']';
});
于 2013-06-11T20:15:29.567 回答
0

在这种情况下,您不仅需要修改输入的名称,还需要修改标签和 ID,这是为了防止任何依赖于这些属性的分类的故障。

CoffeeScript 看起来像这样:

String.prototype.parseIntPlusOne = ->
  this.replace /(\d+)/, (match, num)->
    parseInt(num, 10) + 1

ready = ->
  $('form').on 'click', '.add_comment', (event) ->
    event.preventDefault()

    new_field = $(this).parent().prev('div.field').clone()

    new_field.find('label').attr 'for', (i, attr)->
      attr.parseIntPlusOne()

    new_field.find('input').attr('id', (i, attr)->
      attr.parseIntPlusOne()).attr('name', (i, attr)->
      attr.parseIntPlusOne())

    new_field.insertBefore('p.new_comment_link')

$(document).ready(ready)
$(document).on('page:load', ready)

您可以在这里查看一个工作示例:http: //codepen.io/MarioRicalde/pen/AFLIe

于 2013-06-12T07:21:02.657 回答