我想在给定的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]
)?它可以是任何整数。
答案 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