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

标签 jquery ruby-on-rails database jquery-ui

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

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

这是我的自动完成代码:

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());
}

这是我的模式,我从这个 article 复制的.

模态:

$(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;
  });
});

想法是创建一个远程模式 Controller ,您可以在其中添加一本新书。我有一个多步骤注册,这意味着我的模式必须重定向到一个新页面:general information 如果信息正确但我无法验证表单,因为我的 JavaScript 不起作用...

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

<input data-autocomplete-source="["Sci-fi","Adventure"...] />

我没有发现代码有任何问题,也无法找出问题所在。有人可以帮我解决问题吗? 非常感谢您的帮助和时间。

更新:

据我了解,我的问题来自呈现的操作页面。由于我正在呈现我的模态主体,javascript 不起作用。

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

respond_to do |format|
  format.js { ... }
end

在您的 create 方法(或操作)中的某处,它将标识您的 Assets 中的 create.js.erb。但是,如果你想呈现一个 static 内容(例如 map ),我不知道该怎么做,因为为了定义一个模态,你必须添加 respond_with_modal @books 在您要使用的方法下的 Controller 中。

最佳答案

由于没有工作示例,我只是假设这是一个时间问题,就像@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

根据您的应用程序,您可能希望将事件更改为类似contentUpdated 的内容,这样它更适合一般用途。您可以随意命名事件。您可以在 jQuery article: Introducing Custom Events 上阅读更多内容

关于远程模式 RoR 中的 jQuery UI 自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47957120/

相关文章:

ruby-on-rails - rails 2.3.4 中的 Gem 依赖错误

database - 在一个查询中跨多个 DB2 数据库进行选择

javascript - 通过 JavaScript 发送 Facebook 聊天消息

javascript - 取一个 img src 并将其设置在上层 div 的背景 - JQuery

javascript - JQGrid 在标题栏中显示过滤器详细信息

ruby-on-rails - 使用 rspec 测试 rails 而不需要运行所有初始化程序?

jquery - 防止序列化输入

ruby-on-rails - Ruby - 从不同的服务器复制图像

sql-server - 使用 Microsoft SQL Server 从另一个基于列的表更新表

swift - 使用 Geofire 从 Firebase 查询特定节点?