2015-03-31 55 views
2

我試圖在Splunk中的儀表板上觀看(並根據需要更改)多選的選擇。爲此,我使用Javascript獲取多選,並聽取其上的「更改」事件。在改變時,我運行一個接收多選的函數來檢查和調整選擇。Javascript,jquery,backbone,splunk:on(「change」,{data},handler)導致TypeError

我的代碼大致如下:

// Get the multiselect 
var multi1 = splunkjs.mvc.Components.getInstance("input1"); 

// Function to check selection 
function smartSelector(container){ 
    var multi = container.multi; 
    var selection = multi.val(); 
    if (...) { 
     // Change selection 
     ... 
     // Set new selection to multi and refresh item 
     multi.val(selection); 
     multi.render(); 
    } 
}; 

// On change, run function 
multi1.on("change", function() {smartSelector({multi: multi1})}); 

這工作得很好。但是從我的理解,有從w3schools定義事件,如在這個例子中的處理程序和數據更漂亮的方式:,

function doIt(event) { 
    alert(event.data.msg); 
} 

$(document).ready(function() { 
    $("p").on("click", {msg: "You just clicked me!"}, doIt) 
}); 

但是當我申請這對我這樣的代碼:

// Fetch another multiselect 
var multi2 = splunkjs.mvc.Components.getInstance("input2"); 

// Adjust function code to get event data 
function smartSelector(event){ 
    var multi = event.data.multi; 
    ... 
} 

// Adjust on("change", ...) to work with event data and handler 
multi2.on("change", {multi: multi2}, smartSelector); 

我得到一個TypeError: (intermediate value).callback.call is not a functionmvc.js:6:108716,我認爲這是Backbone(作爲Splunk的一部分)的一部分。

這是什麼原因造成的?我能做些什麼來實現正確的行爲? 謝謝你的想法。

回答

0

我不確定splunkjs組件是否實現.on()的相同簽名,但是如果您嘗試獲取對觸發事件的元素的引用,那麼smartSelector中是否有event.currentTarget

+0

我不知道,因爲在第二個例子中沒有調用smartSelector。 但我想你是對的,我不能假設'on()'在splunkjs中與原始的相比是相同的 - 我會在splunk回答這個問題。 – fishgehoelz 2015-04-07 07:33:32

2

啊,我想我明白了。 使用on(...)的方式與jquery不同,但使用Backbone。你需要做的是這樣的:

multi2.on("change", smartSelector, {multi: multi2}); 

通常情況下,您使用的上下文值來設置this在你打電話起初聽起來不像我想做另一個方面的功能。但它正是我需要的,所以在我的情況,我不得不使用下面的代碼在smartSelector:

function smartSelector(){ 
    var multi = this.multi; 
    var selection = multi.val(); 
    ... 

謝謝squall3d給我,我可能沒有使用正確的on(...)想法!

+0

哈哈我仍然很想知道,smartSelector中的事件參數是否具有currentTarget屬性?即功能smartSelector(event){console.log(event.currentTarget);} – squall3d 2015-04-07 20:25:47

+0

不,事件甚至沒有定義(使用'multi2.on(「change」,smartSelector,{multi:multi2});'that是)。我理解的方式是,你只能用被調用的函數中的'this'來引用你以這種方式傳遞的對象,所以它跟你在jQuery中的做法是不同的。 – fishgehoelz 2015-04-09 06:34:05

相關問題