用+1替换属性中的整数

时间:2013-06-11 20:09:51

标签: jquery coffeescript

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

CoffeeScript的:

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])?它可以是任何整数。

2 个答案:

答案 0 :(得分: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) + ']';
});

答案 1 :(得分:0)

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

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