1

我有这个导轨助手_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
4

1 回答 1

2

您的视图渲染在一秒钟内完成!因此,您看到idall 的值相同的原因inputs

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

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

看起来您希望滑块位于每个输入上,我建议使用数据属性或仅使用 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>

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

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

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

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

更新

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

您可以触发一些自定义事件和调用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()

希望这可以消除任何混乱。

于 2015-02-18T02:47:57.457 回答