gpt4 book ai didi

javascript - 使用 ajax 的 Select2 使用 Rails turbolinks 事件进行了多次初始化

转载 作者:可可西里 更新时间:2023-11-01 01:21:40 25 4
gpt4 key购买 nike

我正在使用 Rails 4.2.6 开发 Ruby On Rails 应用程序。我将 Turbolinks 与 jquery.turbolinks 一起使用(抱歉,我无法发布这些元素的链接,因为我是网站上的新手)。我的问题很简单,但我无法解决。这里是:我有一个通过 AJAX 获取的表单

<div class="card-footer">
<a class="btn btn-sm btn-primary-outline" data-remote="true" href="/profiles/Mke5kA/positions/new"><i class="fa fa-plus"></i> Nouvelle expérience professionnelle</a>
<div id="new_position_form"></div>
</div>

表单包含通过 AJAX 获取数据的 Select2 元素

= simple_form_for [profile, position], remote: true, html: {id: 'positionForm', class: 'm-b-1'} do |f|
= f.input :company_id, as: :select, input_html: {:'data-behaviour' => 'company-select2', :'data-kind' => 'company'}
= f.input :title
= f.input :summary
- location = f.object.build_location
= f.simple_fields_for :location do |l|
= render 'locations/fields', l: l, city: position.city
= render "profiles/shared/date_fields", f: f, model: position
= f.input :skill_list, as: :select, input_html: {multiple: true, :data => {:behaviour => 'acts-as-taggable', :'taggable-context' => 'skills'}}
%button.btn.btn-primary{:type => "submit"}= icon('check-square-o', 'Enregistrer')
= link_to icon('remove', 'Annuler'), 'javascript:void(0)',
data: {:'lgnk-behaviour' => "remove-form", :'lgnk-target' => "#positionForm" }, class: 'btn btn-secondary'
  • Select2 元素目前在 Rails Trubolinks 事件“page:load page:update”时被“激活”,但我也尝试过“page:change”
  • 获取表单时:select2 元素正常(正确激活):

Initial form (after AJAX fetch

当我尝试输入使用 AJAX 获取数据的 Select2 时出现问题:所有 select2 都是重复的:

enter image description here

下面是我如何初始化 Select2:

var loc_tag = function() {
$('[data-behaviour="acts-as-taggable"]').not('.select2-hidden-accessible').each (function (index, element) {
if ($(element).data('value')) {
var options = $(element).data('value').split(', ');
$.each(options, function(key, tag){
$(element).append($('<option selected></option>').val(tag).text(tag));
});
}

$(element).select2({
ajax: {
url: "/tags?context="+$(element).data('taggable-context'),
dataType: 'json',
headers: {
"Accept": "application/json"
},
delay: 250,
data: function (params) {
return {
q: params.term, // search term
page: params.page
};
},
processResults: function (data, page) {
return {
results: data
};
},
cache: true
},
escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
minimumInputLength: 2,
tags: true,
language: "fr",
theme: "bootstrap",
width: "100%",
placeholder: 'Mots clés...'
});
});

};
$(document).on('page:load page:update', loc_tag);

我希望 Select2 元素只初始化一次(在获取表单时),而不是在 AJAX 响应它们获取数据时初始化。我已经在不使用 Select2 的元素上尝试了 jQuery.not(".select2-hiden-accessible") (select2-hidden-accessible 是类 Select2 添加到初始化的 Select2 元素)但它不起作用。

非常感谢您的帮助!

最佳答案

当使用 Turbolinks 5 和 select2 时,select2对象不再附加(参见下面的测试)到 <select>使用后退按钮返回页面时。一个新的select2返回后创建并附加了对象,但它不可用。

jack 的回答对我不起作用,因为当新的 select2添加了对象,<select>仍然有 class='select2-hidden-accessible' 其中,除其他事项外,设置 width: 1px !important .当新select2对象已创建,它基本上是不可见的。

对我来说关键是在 TL 缓存页面之前销毁所有 select2 对象。这是对我有用的解决方案:

$(document).on("turbolinks:before-cache", function() {
$('.select2-input').select2('destroy');
});

$(document).on('turbolinks:load', function() {
$('.select2-input').select2();
});

更多详情

鉴于 Turbolinks documentation,我相信这是正确的方法(强调我的):

Preparing the Page to be Cached

Listen for the turbolinks:before-cache event if you need to prepare the document before Turbolinks caches it. You can use this event to reset forms, collapse expanded UI elements, or tear down any third-party widgets so the page is ready to be displayed again.

测试select2存在

测试select2是否对象附加到 <select>您可以在控制台中执行以下命令:

('.select2-input').first().data('select2')

关于javascript - 使用 ajax 的 Select2 使用 Rails turbolinks 事件进行了多次初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36497723/

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