远程模态RoR中的jQuery UI自动完成

Ant*_*yev 10 database jquery jquery-ui ruby-on-rails

我试图jquery ui autocomplete在我的远程模式中实现它不起作用,而autocomplete在常规静态页面上工作.

对于远程模态,我使用宝石的组合:modal-responder-railsrails-bootstrap-modal

这是我的autocomplete代码:

jQuery(function() {
  var data = $('#book_subcategory_name').data('autocomplete-source');
  var NoResultsLabel = "No Results";
  return $('[id*="book_subcategory_name"]').autocomplete({
    delay: 0,
  position: {
    my: "left+0 top+4"
  },
  source: function(request, response) {
            var results = $.ui.autocomplete.filter(data, request.term);
            if (!results.length) {
              results = [NoResultsLabel];
            }
            response(results);
           },
  select: function (event, ui) {
            if (ui.item.label === NoResultsLabel) {
              event.preventDefault();
            }
          },
  focus: function (event, ui) {
           if (ui.item.label === NoResultsLabel) {
             event.preventDefault();
           }
         }
  }); // End of return
}); // End of jQuery



// Sets autocomplete drop down width equal to the root element width
jQuery.ui.autocomplete.prototype._resizeMenu = function () {
  var ul = this.menu.element;
  ul.outerWidth(this.element.outerWidth());
}
Run Code Online (Sandbox Code Playgroud)

这是我的模态,我从这篇文章中复制了它.

莫代尔:

$(function() {
  var modal_holder_selector, modal_selector;
    modal_holder_selector = '#modal-holder';
    modal_selector = '.modal';
  $(document).on('click', 'a[data-modal]', function() {
    var location;
    location = $(this).attr('href');
    $.get(location, function(data) {
      return 
      $(modal_holder_selector).html(data).find(modal_selector).modal();
    });
    return false;
  });
  return $(document).on('ajax:success', 'form[data-modal]', 

  function(event, data, status, xhr) {
    var url;
    url = xhr.getResponseHeader('Location');
    if (url) {
      window.location = url;
    } else {
      $('.modal-backdrop').remove();
      $(modal_holder_selector).html(data).find(modal_selector).modal();
    }
    return false;
  });
});
Run Code Online (Sandbox Code Playgroud)

我们的想法是创建一个远程模态控制器,您可以在其中添加新书.我有一个多步注册,这意味着我的模式必须重定向到一个新页面:general information如果信息正确但我不能验证表格,因为我JavaScript不工作...

我试图覆盖z-index并尝试!important在我的CSS中使用它仍然无法正常工作.另外,如果我查看浏览器控制台,我可以清楚地看到所有数据都显示在我的input字段中(注意:我的所有数据都来自数据库),如下所示:

<input data-autocomplete-source="["Sci-fi","Adventure"...] />
Run Code Online (Sandbox Code Playgroud)

我没有看到代码有任何问题,我无法弄清楚问题.有人可以帮我解决问题吗?非常感谢你的帮助和时间.

更新:

只要我理解,我的问题来自渲染的操作页面.由于我渲染我的模态体,javascript不起作用.

我找到的解决方案之一是添加

respond_to do |format|
  format.js { ... }
end
Run Code Online (Sandbox Code Playgroud)

在您的create方法(或操作)中的某个位置,它将识别create.js.erb您的资产.但是,如果你想渲染一个static内容(例如地图),我不知道该怎么做,因为为了定义一个模态,你必须respond_with_modal @books在你想要使用的方法下添加你的控制器.

feh*_*ich 1

由于没有有效的示例,我只是假设这是一个时间问题,就像 @muistooshort 指出的那样。您在更新模式之前正确加载 jquery 部分。克服这个问题的一种选择是使用事件。您希望在使用 - 函数更新模态后执行代码html

请尝试以下代码:

$(document).on('modalUpdate', function(){
  var data = $('#book_subcategory_name').data('autocomplete-source');
  //... rest of your autocomplete code
});

//...start of your modal code
$('.modal-backdrop').remove();
$(modal_holder_selector).html(data).find(modal_selector).modal();
$(document).trigger('modalUpdate'); //add this line
//...rest of your modal code
Run Code Online (Sandbox Code Playgroud)

根据您的应用程序,您可能希望将事件更改为类似的事件contentUpdated,以便它适合更通用的目的。您可以为该事件命名任何您喜欢的名称。您可以阅读jQuery 文章的更多内容:自定义事件简介