简体   繁体   English

通过 AJAX 呈现表单时,Javascript 不起作用

[英]Javascript is not working when form is rendered through AJAX

I am new to AJAX and Javascript on rails.我是轨道上 AJAX 和 Javascript 的新手。

When the tab is clicked, the corresponding partial is rendered via AJAX单击选项卡时,通过 AJAX 呈现相应的部分

When the form is rendered on the page without AJAX, flatpickr works perfectly.当表单在没有 AJAX 的页面上呈现时,flatpickr 可以完美运行。

flatpickr working flatpickr 工作

But when I render it with AJAX (replacing the div link with the form), the flatpickr no longer works但是当我用 AJAX 渲染它(用表单替换 div 链接)时,flatpickr 不再工作

flatpickr not working flatpickr 不工作

task#new任务#新

<div id="single_event">
  <%= link_to "Single_event", task_new_path, remote: true %>
</div>

task#new.js.erb任务#new.js.erb

$('#single_event a').parent().html("<%= j render 'single_event_form', meeting: @meeting %>")

single_event_form.html.erb single_event_form.html.erb

<div class="container">
  <%= form_with(model: meeting, local: true, :html => {:id => "flatpickr-form-single"} ) do |form| %>
    <div class="mb-6">
      <%= form.label :body %>
      <%= form.rich_text_area :body, class: 'form-control' %>
    </div>
    <div class="mb-6" style ="width: 30vw;">
      <%= form.label :start_time, class: 'label' %>
      <div class="flex items-center justify-between max-w-md">
        <%= form.text_field :start_time, data: { behavior: "flatpickr" }, placeholder: "Date and time select ...", class: "form-control" %>
      </div>
    </div>
    <div class="field" style ="width: 30vw;">
      <%= form.label :end_time, class: 'label' %>
      <div class="flex items-center justify-between max-w-md">
        <%= form.text_field :end_time, data: { behavior: "flatpickr" }, placeholder: "Date and time select ...", class: "form-control required" %>
      </div>
    </div>
    <%= form.submit class: "btn btn-primary text-base py-1.5 px-5", value: "Confirm" %>
  <% end %>
</div>

flatpickt.js flatpickt.js

import flatpickr from "flatpickr"
require("flatpickr/dist/flatpickr.css")

document.querySelector('#flatpickr-form-single')
    .addEventListener("ajax:success", function(data, status, xhr) {
      flatpickr("[data-behavior='flatpickr']", {
        enableTime: false,
        altInput: true,
        altFormat: "F j, Y",
        minDate: "today"
    })
});

The issue you are experiencing is due to initialising flatpickr only on page load event , you need to initialise it also after the AJAX request finished.您遇到的问题是由于仅在页面加载事件中初始化flatpickr ,您还需要在 AJAX 请求完成后对其进行初始化。

Try adding this to your flatpickt.js with the following and replace with your form id in the querySelector selector:尝试使用以下内容将其添加到您的flatpickt.js中,并在querySelector选择器中替换为您的表单 ID

...
document.addEventListener('turbolinks:load', function() {
  document.querySelector('#single_event a')
    .addEventListener("ajax:success", function(data, status, xhr) {
      flatpickr("[data-behavior='flatpickr']", {
        enableTime: false,
        altInput: true,
        altFormat: "F j, Y",
        minDate: "today"
    })
  });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM