2013-04-26 42 views
0

我試圖在kendo網格中獲取事件回調。我的同事已經開始使用MVC助手創建網格。所以我想綁定到這樣的網格:在kendo網格上綁定函數回調

Html.Kendo().Grid<DetailViewModel>() 
     .Name("details") 
     .Events(events => events.DataBound(@<text>function() { 
              $('input:checkbox.details-checkbox').click(function() { 
       console.log("checked"); 
       handleChecked(); 
      }); 
      }</text>)) 

所以在看文件,我不知道爲什麼我要在這裏使用@標記。我認爲我可以放入我的回調名稱,比如「handleChecked」。儘管對我來說這不起作用。所以我把它包裝在@標籤中。因此,它目前的設置方式,它確實獲得了「檢查」文本到控制檯。但是,我確實希望在複選框被擊中時調用一個方法。我寧願不必將它放在該功能塊中,因爲它會變得混亂。所以我試着做的是在文檔準備好的情況下,定義handleChecked。這看起來像:

@{ 
Html.Telerik().ScriptRegistrar() 
    .Scripts(wa => wa.AddSharedGroup(@Url.AssetName(AssetGroups.SinglePageApps))) 
    .OnDocumentReady(
     @<text> 
      $(document).ready(function() { 

          function handleChecked() { 
       console.log("handle checked"); 
      } 
      console.log("document.ready"); 
      }); 

     </text>); 
} 

所以,當我嘗試運行它,然後點擊一個複選框,我得到handleChecked()是不確定的。所以我不確定在網格填充數據之後綁定到劍道網格中的一行的最佳方式是什麼。它現在正在呈現服務器端,我正在嘗試對DataBound事件進行函數回調,但遇到一些麻煩。有什麼想法嗎?提前致謝。

回答

2

阻止事情按照你想要的方式工作的一個大問題是你正在將JavaScript函數包裝在DOMReady函數中。

在JavaScript中,函數定義了作用域 - 這意味着在另一個函數中定義的任何變量或函數將只存在於外部函數中。

例如:


function foo(){ 
    function bar(){ console.log("bar"); } 
    bar(); 
} 

foo(); // => logs "bar" to the console 
bar(); // fails; bar is undefined/not a function 

當我在此底部調用foo(),foo的函數定義了一個嵌套bar函數,該函數然後調用。之後,當我撥打bar()時,它會失敗。這是因爲bar只存在於foo()函數中。 foo功能退出後,bar超出範圍並且不再可用。

鑑於此,您不希望將您的handleChecked函數包含在DOMReady函數中。相反,您希望將該功能放置在可從整個應用程序訪問的地方。

爲了簡單起見,現在,我建議你只要把函數直接在你的剃鬚刀頁面,在<script>標籤:

<script type="javascript"> 
    function handleChecked(){ 
    // ... do stuff here ... 
    } 
</script> 

沒有必要有任何相關的任何剃刀語法。這只是普通的HTML和嵌入在頁面中的JavaScript。

一旦你有了這個,你可以直接提供「handleChecked」功能名到您events.DataBound函數調用:


    // ... 
    .Events(events => events.DataBound("handleChecked")) 
    // ... 

現在,該功能可在頁面的任何地方,人們會發現,當「DataBound」事件觸發。

希望有所幫助。