2012-08-11 62 views
1

我對我的網格有特殊的實現。
爲此我寫了一些代碼onSelectRowloadComplete方法jqGrid如何做jqGrid的loadComplete和onSelectRow的pre和post方法調用genecally?

onSelectRow我需要更新一個全局數組,並在loadComplete方法我必須訪問全局數組,並需要jqGrid中的一些處理。

直到那時我沒事。我已經這樣做了。 現在我想以這樣的方式擴展這兩個方法,即實現將是通用的(其他網格可以在不編寫任何代碼的情況下使用它)。

爲此我想到了下面的步驟。

  1. 我想添加一個新的JS:在我的HTML(如jquery.jqGrid.additional.js)與jqGrid.js

  2. 我想通過jqGrid的數據陣列我的全局變量賦值

  3. 在這個js我要檢查電網

  4. 如果值是真實的,那麼我想延長onSelectRow,在這種方式的jqGrid執行我的兩個方法和loadComplete方法多選的值代碼寫在o中nSelectRow,也是loadComplete方法。

例如,我有preLoadCompletepostLoadComplete需要被正好之前和之後loadComplete方法執行執行。同樣,這也適用於onSelectRow方法。

我在jquery.jqGrid.additional.js中寫下面的代碼,然後在jqGrid加載後沒有得到alert(1),alert(2)。

它只執行寫在jqGrid的loadComplete方法中的代碼。

var oldLoadComplete = $.fn.jqGrid.loadComplete; 

$.jqGrid.extend({ 
    loadComplete: function(){ 
     var ret; 
     // do someting before 
     alert(1); 

     ret = oldLoadComplete.call (this); 

     // do something after 
     alert(3); 

     return ret; // return original or modified results 
    } 
}); 

我嘗試了很多,花了很多時間。

回答

1

您正在嘗試擴展$.jqGrid而不是$.fn.jqGrid。在第一行中,這意味着$.jqGrid甚至不存在,並且所有元素都無法訪問修改後的.jqGrid插件,但仍然是默認設置。

雖然我試圖擴展$.fn與「新」追加方法沒有奏效。您可能必須明確地覆蓋這些方法。我可以想象,jQuery有自己的一些安全例程和內置在$.extend方法中的插件。

var oldLoadComplete = $.fn.jqGrid.loadComplete; 

$.fn.jqGrid.loadComplete = function() { 
    alert('pre'); 
    var ret = oldLoadComplete.apply(this, arguments); // In case any arguments will be provided in future. 
    alert('post'); 
    return ret; 
}; 

編輯:

忘記了這一切。這是無關緊要的。看了一下GitHub上的jqGrid的源代碼後,很明顯,jqGrid甚至不使用類似$.fn.jqGrid.loadComplete的東西。這是你自己編造的東西。相反,它會創建另一個對象,提供可能的屬性和默認值列表,然後由自定義默認值覆蓋,最後由您調用jqGrid時傳入的函數參數來覆蓋。

我發現jqGrid在分別調用loadComplete回調函數之前和之後在您的一組匹配元素(即this)上觸發了兩個事件jqGridLoadCompletejqGridAfterLoadComplete

所以基本上,你不能使用你的嘗試。取而代之的是,在我腦海中唯一的解決辦法是覆蓋jqGrid的「構造」(即$.fn.jqGrid)用同樣的方法,並應用聽衆this像這樣:

var oldJqGrid = $.fn.jqGrid; 

$.fn.jqGrid = function() { 
    this.on('jqGridLoadComplete', function(jqEvt) { 
      alert('Pre'); 
     }) 
     .on('jqGridAfterLoadComplete', function(jqEvt) { 
      alert('Post'); 
     }); 
    return oldJqGrid.apply(this, arguments); 
}; 

關於你的多選...我不不知道你在說什麼。我自己的時間非常有限,現在不得不拒絕進一步的協助。

真誠。

+0

嗨Derija,謝謝你的回覆。根據你的建議,我在jquery.jqGrid.additional.js中添加了上面的代碼。我的jqGrid如下所示,$(「#appAndContextTable」)。jqGrid({datastr:jsonString, ........, loadComplete:function(){ alert('Need to implement'); } });當我加載網格時,我得到了使用loadComplete方法寫入的警報。我沒有獲得預警和發佈警報。請幫助我如何獲得預先,發佈警報也。我怎樣才能得到屬性multiselect在我自己定義的loadComplete方法的價值? – user1591670 2012-08-13 18:12:36

+0

@ user1591670只是關於我的帖子更新的通知。你可能想閱讀它。另外我建議在發佈另一個問題之前瀏覽一下你正在嘗試擴展的項目的源代碼。幫助很多。 ;)把這些東西搞清楚jqGrid花了我大約10分鐘。 – Kiruse 2012-08-13 19:15:37

+0

謝謝Derija的幫助。我的問題解決了。你真的幫了我很多。另外我找到了獲取jqGrid的不同屬性值的方法。再次感謝。 – user1591670 2012-08-13 21:45:58