【问题标题】:How to add a row hyperlink for an extJS Grid?如何为 extJS Grid 添加行超链接?
【发布时间】:2010-07-26 16:58:14
【问题描述】:

有人可以说明如何在 ExtJS 中的特定列的单元格中呈现超链接吗? 我已经尝试将该列绑定到我的 JS 中的渲染函数,我从中发回 html:

<a href="ControllerName/viewName">SELECT</a>

但是,问题在于,一旦我通过链接点击控制器,导航成功,但随后导航到数据网格仅显示空记录。

通过 Spring MVC 控制器成功从数据库中获取记录,我已经检查过了。

请注意,只有当我使用 extJS 网格中的行超链接导航离开网格时,才会发生这种情况。如果我来到网格,并在其他地方导航并再次返回网格,则数据显示正常。 仅在使用一个/任何单元格中呈现的超链接导航离开网格的情况下才会出现此问题。

感谢您的帮助!

【问题讨论】:

    标签: datagrid extjs hyperlink


    【解决方案1】:

    这适用于 ExtJS 4 和 5。

    使用renderer 使内容看起来像一个链接:

    renderer: function (value) {
        return '<a href="#">'+value+'</a>';
    }
    

    然后使用未记录的、动态生成的View事件cellclick来处理点击:

    viewConfig: {
        listeners: {
            cellclick: function (view, cell, cellIndex, record, row, rowIndex, e) {
    
                var linkClicked = (e.target.tagName == 'A');
                var clickedDataIndex =
                    view.panel.headerCt.getHeaderAtIndex(cellIndex).dataIndex;
    
                if (linkClicked && clickedDataIndex == '...') {
                    alert(record.get('id'));
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试这样的:

      Ext.define('Names', {
          extend: 'Ext.data.Model',
          fields: [
              { type: 'string', name: 'Id' },
              { type: 'string', name: 'Link' },
              { type: 'string', name: 'Name' }
          ]
      });
      
       var grid = Ext.create('Ext.grid.Panel', {
          store: store,
          columns: [
              {
                  text: 'Id',
                  dataIndex: 'Id'
              },
              {
                  text: 'Name',
                  dataIndex: 'Name',
                  renderer: function (val, meta, record) {
                      return '<a href="' + record.data.Link + '">' + val + '</a>';
                  }
              }
                     ...
                     ...
                     ...
      

      不过我要感谢 - ExtJS Data Grid Column renderer to have multiple values

      【讨论】:

        【解决方案3】:

        我可能不会使用锚标记,而是使用样式看起来像锚的普通单元格内容(使用基本 CSS)并处理 GridPanel 的 cellclick 事件来处理操作。这避免了处理重新加载页面的锚的默认点击行为(这是我假设正在发生的事情)。

        【讨论】:

        • 使用锚标签是更好的语义标记。还省去了仔细重现细节,例如使用 CSS 的鼠标指针图标。
        【解决方案4】:

        我创建了一个渲染器,看起来就像你在点击它。

        aRenderer: function (val, metaData, record, rowIndex, colIndex, store){
        // Using CellClick to invoke
        return "<a>View</a>";
        },
        

        但我使用单元格事件来管理点击。

        cellclick: {
            fn: function (o, idx, column, e) {
                if (column == 1)  // Doesn't prevent the user from moving the column
                {
                    var store = o.getStore();
                    var record = store.getAt(idx);
                    // Do work
                }
            }
        }
        

        【讨论】:

        • 很好的答案,除了 a) 我认为 a 需要 href 看起来像一个链接,并且 b) 你宁愿比较从 grid.getColumnModel().getDataIndex(column) 获得的字段名称而不是列索引。
        • 使用 column == 1 不是一个好习惯,因为如果列排序或可移动属性未设置为 false,那么用户可以通过拖放重新排序列,因此您的列没有列可能会发生变化,因此请谨慎使用它
        【解决方案5】:

        出于这些目的,我根据我的实际需要使用CellActionsRowActions 插件,并通过它处理单元格点击。

        如果您想要看起来像锚的东西,请改用 &lt;span&gt; 并按照 @bmoeskau 的建议进行操作。

        【讨论】:

          【解决方案6】:

          您可以使用“渲染器”功能将您想要的任何 HTML 包含到单元格中。

          【讨论】:

            【解决方案7】:

            感谢大家的回复。 调试完 extJS-all.js 脚本后,我发现问题出在服务器端。

            在我的 Spring MVC 控制器中,我将模型设置为会话,在我之前提到的用例中,它用于将 Ext.data.XmlStore 的“totalProperty”重置为 0,因此随后对网格,用于显示空记录。

            这是因为 ext-JS 网格在遍历数据存储中的记录之前会检查“totalProperty”值。就我而言,dataStore 有数据,但大小被重置为 null,因此问题出现了。

            再次感谢大家的投入!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-01-17
              • 2021-06-04
              • 1970-01-01
              • 1970-01-01
              • 2017-09-16
              • 1970-01-01
              • 2019-02-06
              相关资源
              最近更新 更多