jQuery小部件,_on()方法和Rails ajax回调

时间:2013-12-15 19:28:24

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

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 widget事件监听器结合?感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

现在使用冒号制作事件名称是很常见的,因此发送拉取请求可能是个好主意。

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