【问题标题】:jQuery widget, _on() method and Rails ajax callbacksjQuery 小部件、_on() 方法和 Rails ajax 回调
【发布时间】:2013-12-15 19:28:23
【问题描述】:

Rails 提供了不同的开箱即用的 ajax 事件。 (更多信息可以在这里找到——https://github.com/rails/jquery-ujs/wiki/ajax,源代码可以在这里找到——https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L125

现在我有一个自定义小部件,其中定义了两个 _on() 方法。这是相关的代码片段:

_create: function() {
  this._on(this.document, {
    "ajax:beforeSend #some-form": function(event, xhr, settings) {
      return console.log("Before send");
    }
  });

  this._on({
    // Event listeners for widget local events 
  });
}

我已经到了可以拥有两个_on() 方法的地步,并且两者都在工作。第一个监听 document 内部发生的所有事件(所以如果我有像 click * 事件这样非常琐碎的事情 - 它会起作用),第二个监听仅在小部件内触发的事件。

如果我将 rails 回调直接绑定到 $(document).ready 函数中的元素,一切正常。当我尝试将 rails ajax:beforeSendajax:success 和其他类似事件的事件侦听器添加到第一个 _on() 方法中时,问题就开始了——它根本不起作用。

任何想法如何将 Rails 事件与 jquery-ui 小部件事件侦听器结合起来?谢谢。

【问题讨论】:

    标签: jquery ruby-on-rails jquery-ui jquery-widgets


    【解决方案1】:

    如果您在 jQuery UI 中查看 _on() 的代码,您会发现它使用正则表达式 /^(\w+)\s*(.*)$/ 来获取事件名称和选择器:

    var match = event.match( /^(\w+)\s*(.*)$/ ),
            eventName = match[1] + instance.eventNamespace,
            selector = match[2];
    

    显然,它将您想要的 ajax:beforeSend 事件视为 ajax 和像 :beforeSend #some-form 这样的选择器,而不是触发处理程序。

    现在在事件名称中使用冒号是一种常见的做法,因此发送拉取请求可能是个好主意。

    同时,您可以为所需事件注册全局处理程序,并使用不同的名称重新触发它们,而不用冒号。

    【讨论】:

    • 耶!触发具有不同名称的事件就可以了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2013-06-04
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多