2013-12-15 15 views
0

Rails提供了不同的ajax事件。 (更多信息可以在這裏找到 - https://github.com/rails/jquery-ujs/wiki/ajax,源代碼可以在這裏找到 - https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L125jQuery小部件,_on()方法和Rails ajax回調

現在我有一個自定義小部件有兩個_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小部件事件監聽器?謝謝。

回答

1

如果你看看_on()在jQuery UI的代碼,你會看到它使用正則表達式/^(\w+)\s*(.*)$/獲取事件名稱和選擇:

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

顯然,它認爲你的期望ajax:beforeSend事件剛剛ajax和選擇器像:beforeSend #some-form,而不是觸發處理程序。

現在在冒號裏面用冒號命名事件名是常見的事情,所以發送pull請求可能是個好主意。

同時,您可以註冊所需事件的全局處理程序,並使用不含冒號的不同名稱重新觸發它們。

+0

耶!用不同的名字命名一個事件的伎倆!謝謝! – Ruslan