我有这个rails helper _fields_answer.html.erb
<fieldset>
<div class="row">
<div class="col-xs-9">
<%= answerf.text_area :content, placeholder: "Answer", class: "form-control" %>
</div>
<%= answerf.hidden_field :question_number, value: qn %>
<div class="col-xs-2 buttonProjDel">
<%= answerf.hidden_field :_destroy %>
<%= link_to "remove", '#', class: "remove_fields btn btn-danger btn-xs buttonProjDelBut" %>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<% st = Time.now.strftime("%I%M%S%p") %>
<%= answerf.text_field :scale, id: 'slf'+st , type: 'text',
data: {'slider-id' => 'scale',
'slider-min' => '0',
'slider-max' => '10',
'slider-step' => '1',
'slider-value' => '5' } %>
</div>
</div>
<script>
$('<%= '#slf'+st %>').slider()
</script>
</fieldset>
我动态渲染这个帮助器,但我可以在第一个中使用滑块。所以我尝试为每个人提供不同的Id
,但我无法做到。
使用上面的代码,我总是得到相同的Id
,即使使用Time
。
为什么id
中使用的时间始终相同?
还有另一种方法吗?我希望每个答案都有一张幻灯片。
修改
呈现帮助程序的代码:
在projects.js.coffee
$(document).on 'click', 'form .add_fields', (event) ->
time = new Date().getTime()
regexp = new RegExp($(this).data('id'), 'g')
$(this).before($(this).data('fields').replace(regexp, time))
event.preventDefault()
在application_helper.rb
中 def link_to_add_fields(name, f, association, locals)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = f.fields_for(association, new_object, child_index: id) do |builder|
render("fields_" + association.to_s.singularize, answerf: builder, qn: locals[:qn])
end
link_to(name, '#', class: "add_fields " + locals[:class], data: {id: id, fields: fields.gsub("\n", "")})
end
答案 0 :(得分:2)
您的视图渲染在一秒钟内完成!因此,您看到所有id
的{{1}}值相同。
下面的语句将具有相同的值60秒。
inputs
因为看起来你想要滑块放在每个输入上,我建议使用数据属性或简单地使用css类。使用css类的一个例子是:
st = Time.now.strftime("%I%M%S%p")
假设我们分配了类 <div class="row">
<div class="col-xs-12">
<%= answerf.text_field :scale, class: 'has-slider', type: 'text',
data: {'slider-id' => 'scale',
'slider-min' => '0',
'slider-max' => '10',
'slider-step' => '1',
'slider-value' => '5' } %>
</div>
</div>
,我们可以使用此类选择器并在javascript中对匹配的元素执行has-slider
:
slider()
而且,你似乎知道为什么你只在第一个输入上有滑块;这是因为您的所有输入都具有相同的# app/assets/javascripts/input_slider.js.coffee
$ ->
# Execute slider on all inputs with has-slider css class
$('input.has-slider').slider()
值,并且DOM选择会检索第一个匹配项。 id
需要在文档中是唯一的。
更新:
当你在页面加载后在dom中添加输入元素时,在id
上进行的$('input.has-slider').slider()
调用将无效。它只适用于DOM中已存在的元素。为了使它适用于DOM加载后添加的元素,您可以使用jQuery app/assets/javscripts/input_slider.js.coffee
方法。
您可以触发一些自定义事件并调用on()
方法,如下所示:
slider()
然后,您将收听# app/assets/javascripts/projects.js.coffee
$(document).on 'click', 'form .add_fields', (event) ->
...
$(this).before($(this).data('fields').replace(regexp, time)).trigger('show-slider')
..
事件并将show-slider
称为:
slider()
希望这可以解决任何困惑。