4

我希望下面的代码卸载一个 javascipt jqgrid,然后用不同的选项加载另一个网格,包括不同的列

//onload
(function($)
$.fn.myGridFn = function(options){
   $(this).jqGrid('GridUnload');
   $(this).jqGrid(options.gridoptions);


//....

$('#select').change(function(){ 
    switch($(this).val())
    {
      case 'grid1':
            $('#grid').myGridFn({gridoptions:{/*grid1 options*/}});
            break;
      case 'grid2':
            $('#grid').myGridFn({gridoptions:{/*grid2 options*/}});
            break;
    }
   });


})(jQuery);

//...
<table id="grid"></table>

我得到的是网格卸载,然后我必须更改选择元素中的选择并再次返回以加载新网格。

更新: 如果我用实际的元素选择器 $('#grid') 替换插件中的 $(this) - 它工作得很好,我不能在我的真实应用程序中这样做,因为该插件被其他几个表格元素使用并且网格

4

4 回答 4

4

为未来的读者清理:

所以这是一种工作小提琴:http: //jsfiddle.net/s3MsW/10/

我说“有点”是因为底层代码是可疑的(jqGrid 本身)。但是我们马上就会到达那里......第一件事:如果你为插件记录“this”,它实际上是 jQuery 对象,而不是节点。从理论上讲,我们可以$(this)在您的原始代码中替换为this并且一切都应该工作。

除了没有。

实际上,您可以使用this卸载 Grid,但随后该函数this作为不指向呈现页面上的表的引用留下。有一些方法可以表明旧节点仍然存在(http://jsfiddle.net/s3MsW/8是一个测试),但只要说它不能再用于将新表呈现到正确的页面上就足够了。

除了缓存选择器字符串并从头开始重新选择干净的表(即创建一个新的 jQuery 对象)之外,别无选择:

$.fn.myGridFn = function(options){
   var theId = this.selector;
   this.jqGrid('GridUnload'); // reference works for now
   $(theId).jqGrid(options); // reference is broken, so re-select with cached ID
}

如果您对内存使用很认真,您可能想要销毁this(幽灵节点),但保留它可能没有真正的危害。

于 2012-04-04T05:04:00.867 回答
1

在我看来,您应该只保存$(this)在一个变量中$this,然后再使用它。问题只是在里面

$('#select').change(function(){/*here*/}); // another value of this

所以你应该做

(function($)
$.fn.myGridFn = function(options) {
    var $this = $(this), selector = $this.selector;

    $this.jqGrid('GridUnload');
    $this = $(selector);    // reset $this value
    ...    

    $('#select').change(function() { 
        switch($(this).val()) { // here is $('#select')
          case 'grid1':
                $this.myGridFn({gridoptions:{/*grid1 options*/}});
                ...

另外一种用法通常以

return this.each( function() { ...

确保您的插件在使用情况下也能正常工作,例如$(".myGridClass").myGridFn(...)在包装集合中可以将多个元素作为一个元素$(".myGridClass")

于 2012-04-04T05:21:08.737 回答
0

这个问题难倒了,上面的答案是正确的。

我一直在尝试执行以下操作:

this.jqGrid('GridUnload')
this.('getGridParam'); /* Still returning all the parameters for the grid. */

相反,我做了:

var $t = $(this.selector);
$t.jqGrid('GridUnload');
$t = $(this.selector);
$t.jqGrid('getGridParam'); /* Now empty */
于 2013-02-18T17:12:40.047 回答
-1

我觉得你应该试试

$('#select option:selected).val()// gives the value of the selected option.
$('#select option:selected).text()// gives the text of the selected option.

代替

$(this).val() 

在 switch 的括号中

于 2012-04-04T04:01:49.827 回答