首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Zend的jqGrid (zfdatagrid)

带有Zend的jqGrid (zfdatagrid)
EN

Stack Overflow用户
提问于 2012-05-04 23:46:40
回答 2查看 1.8K关注 0票数 3

几天后我就找不到正常的答案了。我希望有人能帮我。

我在Zend应用程序中使用jqGrid。我希望应用程序中的网格可以被内联(编辑)编辑。当我不使用ZF时,我自己编写jqGrid代码(java脚本)-内联编辑工作正常。但是,当使用ZF类"Bvb_Grid_Deploy_JqGrid“并部署网格时,ZF会自行生成java脚本。我找不到ZF方法正确插入js函数"onSelectRow“的问题。尝试在ZF控制器中使用“$ grid ->jqAddOnLoad($js)”,但是这个java脚本代码在示例中不像,然后网格根本没有正常加载。必须:

代码语言:javascript
复制
jQuery().ready(function (){
  jQuery("#jqg_RentAsset").jqGrid(
  {
    height: 250,
     ...
    multiselect: true,
    caption: "Manipulating Array Data",
    onSelectRow: function(id)
    {
      alert(id);
    }
  });

但却发生了:

代码语言:javascript
复制
$(document).ready(function() {
  jQuery("#jqg_RentAsset").jqGrid(
  {
    onSelectRow: function(id)
    {
      alert(id);
    }
  });
  jQuery("#jqg_RentAsset").jqGrid(
  {
    "height":"250",
      ...
  });

也许有人知道我必须在ZF中使用什么方法,或者我需要编写java脚本的方式有多不同?

EN

回答 2

Stack Overflow用户

发布于 2012-05-05 12:03:06

我自己也不使用Zend框架。因此,我的建议是常见的,他们是独立的框架,您使用。

在下面的示例中,我将展示如何在网格上动态设置onSelectRow以实现行选择上的内联编辑。我认为网格中已经存在其他必需的设置,如editable: true属性、colModelediturl选项。因此,我只动态显示onSelectRow的设置。

第一种方法是使用setGridParam设置onSelectRow回调。对应的演示使用以下代码:

代码语言:javascript
复制
$(function () {
    var $grid = $("#list"),
        editingRowId,
        myInlineEditingOptions = {
            keys: true,
            oneditfunc: function (id) { editingRowId = id; },
            afterrestorefunc: function () { editingRowId = undefined; },
            aftersavefunc: function () { editingRowId = undefined; }
        };

    $grid.jqGrid({
        datatype: 'local',
        ....
        editurl: 'clientArray'
    });

    // now we set or change onSelectRow callback AFTER jqGrid is created
    $grid.jqGrid('setGridParam', {
        onSelectRow: function (id) {
            if (id !== editingRowId) {
                if (typeof editingRowId !== "undefined") {
                    // save previously editing row
                    //$(this).jqGrid("saveRow", editingRowId, myInlineEditingOptions);

                    // discard changes from the previously editing row
                    $(this).jqGrid("restoreRow", editingRowId, myInlineEditingOptions);
                }
                // start inline editing. The user should save the row by pressing ENTER
                $(this).jqGrid("editRow", id, myInlineEditingOptions);
            }
        }
    });
});

在上面的场景中,重要的是要提到

  1. 我们可以在onSelectRow 创建之后设置(或更改) jqGrid。
  2. 它可以是,在网格中只有一个 onSelectRow回调。设置新的onSelectRow回调覆盖现有回调。

最后一个限制可能是非常困难的。例如,您不能实现一些默认的onSelectRow操作,应该对项目中的所有网格执行这些操作,而对一些附加的特定操作使用额外的onSelectRow。这是引入jQuery类事件的主要原因,这些事件可以非常接近地用于回调。下一个示例演示了该技术。

下一个演示与前一个完全一样,但它使用的是jqGridSelectRow事件而不是onSelectRow回调。这种新技术有两个重要的优点。

  1. 可以在创建jqGridSelectRow事件处理程序之前或之后设置jqGrid事件处理程序。如果使用jQuery.bind绑定事件处理程序,那么将转换为网格的<table>元素应该存在。如果使用稍微慢一点的jQuery.delegatejQuery.livejQuery.on (最后一个从jQuery 1.7开始),则可以随时绑定事件处理程序。
  2. one可以设置多个 jqGridSelectRow事件处理程序,所有这些处理程序都将在唯一的onSelectRow回调(如果存在的话)之前执行。按照这种方式,您可以在jqGridSelectRow事件处理程序中实现一些常见的操作,并可以对特定于网格的操作使用附加的jqGridSelectRow事件处理程序或onSelectRow回调。对于终结操作,可以使用onSelectRow回调。

相应的代码如下

代码语言:javascript
复制
$(function () {
    var $grid = $("#list"),
        editingRowId,
        myInlineEditingOptions = {
            keys: true,
            oneditfunc: function (id) { editingRowId = id; },
            afterrestorefunc: function () { editingRowId = undefined; },
            aftersavefunc: function () { editingRowId = undefined; }
        };

    $grid.bind("jqGridSelectRow", function (e, id) {
        if (id !== editingRowId) {
            if (typeof editingRowId !== "undefined") {
                // save previously editing row
                //$(this).jqGrid("saveRow", editingRowId, myInlineEditingOptions);

                // discard changes from the previously editing row
                $(this).jqGrid("restoreRow", editingRowId, myInlineEditingOptions);
            }
            // start inline editing. The user should save the row by pressing ENTER
            $(this).jqGrid("editRow", id, myInlineEditingOptions);
        }
    });

    $grid.jqGrid({
        datatype: 'local',
        ....
        editurl: 'clientArray'
    });
});

更新了:我忘了提到,在事件绑定期间可以使用名称空间。在更复杂的情况下,这是非常有用的。如果使用$grid.bind("jqGridSelectRow.myNamespace", ...);,那么您将只能使用$grid.unbind('.myNamespace');$grid.unbind('jqGridSelectRow.myNamespace');解除绑定自己的事件。它不会解除其他具有其他命名空间的事件的绑定。

票数 2
EN

Stack Overflow用户

发布于 2012-05-05 13:59:16

我改变了一点行为。我在ZF视图(phtml文件)中编写了java脚本"onSelectRow“,类似于:

代码语言:javascript
复制
<?php $this->headScript()->captureStart() ?>
$(document).ready(function() {
    var lastSel;
    jQuery("#jqg_RentAsset").jqGrid('setGridParam', {
        onSelectRow: function(id)
        { 
            alert(id);
        }
    });
});
<?php $this->headScript()->captureEnd() ?>

而且起作用了。我需要的是"setGridParam",但实际上这个东西在ZF控制器中使用“$grid->jqAddOnLoad($js)”无法工作。当我有时间的时候,我会调查还需要做什么。但现在我很开心。此外,也许有可能使用“$grid->setParams(数组)”.再谢谢你一次。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10457491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档