gpt4 book ai didi

javascript - 在 Rails 助手中生成唯一标识符

转载 作者:行者123 更新时间:2023-11-30 17:02:35 24 4
gpt4 key购买 nike

我有这个 Rails 助手 _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>

我动态渲染这个助手,但我只能在第一个中使用 slider 。所以我尝试为每个人设置不同的 Id,但我做不到。使用上面的代码,我总是得到相同的 Id,即使使用 Time

enter image description here

enter image description here

为什么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

最佳答案

您的 View 渲染在一秒钟内完成!因此,您看到所有 inputsid 值相同的原因。

下面的语句将在 60 秒内具有相同的值。

st = Time.now.strftime("%I%M%S%p")

由于您希望 slider 位于每个输入上,因此我建议使用数据属性或简单的 css 类。使用 css 类的示例是:

  <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>

假设我们分配类 has-slider,然后我们可以使用此类选择器并在 javascript 中的匹配元素上执行 slider() 如下:

# app/assets/javascripts/input_slider.js.coffee

$ ->
# Execute slider on all inputs with has-slider css class
$('input.has-slider').slider()

而且,您似乎知道为什么只有第一个输入有 slider ;这是因为您的所有输入都具有相同的 id 值,并且 DOM 选择会检索第一个匹配项。 id在文档中必须是唯一的。

更新:

当您在页面加载后在 dom 中添加输入元素时,$('input.has-slider').slider() 调用 app/assets/javscripts/input_slider.js.coffee 将不起作用。它只适用于 DOM 中已经存在的元素。为了使其适用于 DOM 加载后添加的元素,您可以使用 jQuery 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() 作为:

# app/assets/javascripts/input_slider.js.coffee

$ ->
# Execute slider on all inputs with has-slider css class
$('input.has-slider').slider()

$(document).on 'show-slider', (event) ->
$(input.has-slider').slider()

希望这能消除任何混淆。

关于javascript - 在 Rails 助手中生成唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com