`

ExtJs 中的TreeGrid(Ext.ux.maximgb.tg.EditorGridPanel详解与其他问题解决办法)

阅读更多


                           Ext.ux.maximgb.tg

                                  http://www.max-bazhenov.com/dev/ux.maximgb.tg/

  这个包的作用是 对有树型表格的需求有很大的帮助,相信有许多人都有用过,也常常遇到过许多问题,本人在使用时也同样遇到过许多问题,经过痛苦的煎熬后,终于有点小见解,特在此留下纪录,以备在以后的Extjs开发项目中有这方面的需求。

    网上其实这方面的讲解其实很少,不是说很少,而是转载的都是基本是同一篇相关文章,对此我也比较郁闷,不是说不能转载,只是转载的文章如果本来就有问题的话,那可真够郁闷的!本来刚开始摆弄这东西的时候,就是这样,因为网上都是转载http://www.liyonghome.cn/index.php/archives/187.html这个地址的文章,其中不乏有对此方面的讲解,但同样也有错误,本人项目中也用到,借鉴其中却并不能解决问题,网上基本找的资料都是这篇文章的模板,哎,郁闷啊!


   在Ext.ux.maximgb.tg中有可编辑的树形表格可供使用,用到的是

Ext.ux.maximgb.tg.EditorGridPanel
 

   在例子中

var data = [
  {"_id":1,"_parent":null,"_level":1,"_lft":1,"_rgt":98,"_is_leaf":false,"item":"总成本"},
  {"_id":2,"_parent":1,"_level":2,"_lft":2,"_rgt":49,"_is_leaf":true,"item":"网络成本"}
];
var record = Ext.data.Record.create([
  {name: '_id', type: 'int'},
  {name: '_level', type: 'int'},
  {name: '_lft', type: 'int'},
  {name: '_rgt', type: 'int'},
  {name: '_is_leaf', type: 'bool'},
  {name: 'item'}
]);
var store = new Ext.ux.maximgb.tg.NestedSetStore({
  autoLoad : true,
  reader: new Ext.data.JsonReader({id: '_id'}, record),
  proxy: new Ext.data.MemoryProxy(data)
});

 

 

  是类似于这样的写法,是因为树形结构使用的是基于左右值的无限分类算法(网友见解), 但这样的话,计算每个节点的_lft和_rgt相当的麻烦,同时以后如果需要添加的话也是不太可能,因为_lft和_rgt位置不易改变和更改了,因此这种

Ext.ux.maximgb.tg.NestedSetStore
 

 的话,无法灵活使用(它需要配置_lft、_rgt、_id、_parent、_level、_is_leaf),真正用到的反而是另外一种:

Ext.ux.maximgb.tg.AdjacencyListStore
 

 它所需要的 只要_id、_parent、_is_leaf的配置参数 ,因此他只需要通过_id知道父节点即可定位(_parent),但是要注意此时只需要_id、_parent、_is_leaf这三个参数即可,记住以下一句话:

With AdjacencyListStore you don't need the _level, _lft, and _rgt fields. In fact, having them can mess up the TreeGrid Displ

 

 不要多此一举写多了配置参数,因为写了其他的参数的话,不仅不能正常显示,反而会更糟糕!

本人正因为网上的其他转载文章而误导了,因为其他的文章都不够严谨!不是多了就是少了,例如以下的例子就是错误的 ,请注意:

var data = [
  {"_id":1,"_parent":null,"_level":1,"_is_leaf":false,"item":"主营业务成本","YN":64.72},
  {"_id":2,"_parent":1,"_level":2,"_is_leaf":true,"item":"网络维护成本","YN":64.72}
];
var record = Ext.data.Record.create([
  {name: '_id', type: 'int'},
  {name: '_level', type: 'int'},
  {name: '_is_leaf', type: 'bool'},
  {name: 'item'},
  {name: 'benbu', type: 'float'}
]);
var store = new Ext.ux.maximgb.tg.AdjacencyListStore({
  autoLoad : true,
  reader: new Ext.data.JsonReader({id: ‘_id’}, record),
  proxy: new Ext.data.MemoryProxy(data)
});



 

   如果你想用Ext.ux.maximgb.tg.AdjacencyListStore这个Store来省略_lft、_rgt的配置的话,那么请你严谨点,他 只要_id、_parent、_is_leaf的配置参数即可,其它的参数多了反而会出错,例如:子节点总是显示在最后,还有错位!

谢谢!





 

分享到:
评论
1 楼 duyupeng 2014-03-13  
你好,我最近也是在使用这个控件,只是用了_id、_parent、_is_leaf这三个配置参数,但是从后台取回数据后,出现了子节点总是显示在最后的情况,能帮忙看下是哪出问题了么

<script type="text/javascript">
  var root="<%=path%>";
var nodeGrid;
var rootNode;
function to_init(){
    Ext.QuickTips.init();
   // create the data store
       var record = Ext.data.Record.create([
        {name: 'nodecode'},
        {name: 'nodename'},
        {name: 'nodetype'},
        {name: 'islocal'},
        {name: 'domainid'},
        {name: 'subdomainid'},
        {name: 'propagationtype'},
        {name: 'epgdeployed'},
        {name: 'resourceDeployType'},
        {name: '_id', type: 'int'},
       {name: '_parent', type: 'auto'},
       {name: '_is_leaf', type: 'bool'}
      ]);
  
  
   var store = new Ext.ux.maximgb.treegrid.AdjacencyListStore({
     autoLoad : true,
     url: '<%=path%>/shinenode.do?type=queryShinenode',
reader: new Ext.data.JsonReader(
{
id: '_id',
root: 'data',
totalProperty: 'total',
successProperty: 'success'
},
record
)
     });
  
    var treeGrid = new Ext.ux.maximgb.treegrid.GridPanel({
        store: store,
        master_column_id : 'nodename',
        columns: [
  {id:'nodename',header: "区域", dataIndex:'nodename', width: 160, sortable: true},
  {header: "节点代码", dataIndex:'nodecode', width: 80, sortable: true}
  //{header: "节点名称", dataIndex:'nodename', width: 80, sortable: true},
  //{header: "节点类型", dataIndex:'nodetype', width: 80, sortable: true},
  //{header: "本地部署", dataIndex:'_parent', width: 70, sortable: true},
  //{header: "子域", dataIndex:'_is_leaf', width: 60, sortable: true},
  //{header: "EPG部署", dataIndex:'epgdeployed', width: 70, sortable: true},
          //{header: "部署网元", dataIndex:'_id', width: 80, sortable: true, renderer: showDeployNeUrl},
          //{header: "配置服务", dataIndex:"_id", width: 80, sortable: true, renderer: showDeployNeServiceUrl},
          //{header: "配置IP地址段", dataIndex:"_id", width: 100, sortable: true, renderer: showDeployIPUrl},
         // {header: "编辑", dataIndex:"_id", width: 50, sortable: true, renderer: showEditUrl},
         // {header: "删除", dataIndex:"_id", whidth: 50, sortable: true, renderer: showDeleteUrl}
        ],
        stripeRows: true,
        autoExpandColumn: 'nodename',
        title: '节点管理',
        root_title: 'Globle'
      });
   
var viewport = new Ext.Viewport({
    layout: 'fit',
    autoScroll: true,
containerScroll: true,
    items: treeGrid
    });
treeGrid.getSelectionModel().selectFirstRow();

}

function showDeployNeUrl(value){
return "";
}

function showDeployNeServiceUrl(value){
return "";
}

function showDeployIPUrl(value){
return "";
}

function showEditUrl(value){
return "";
}

function showDeleteUrl(value){
return "";
}

</script>


这是每次后台返回的数据
{"data":[{"_id":1,"_is_leaf":false,"company":"ShineTV_sd"}],"success":true,"total":1}

{"data":[{"_id":46,"_is_leaf":true,"_parent":1,"company":"ShineTV_jnnode"},{"_id":123,"_is_leaf":true,"_parent":1,"company":"ShineTV_YangXin"},{"_id":4,"_is_leaf":false,"_parent":1,"company":"ShineTV_qd"},{"_id":108,"_is_leaf":true,"_parent":1,"company":"ShineTV_ShineTV_yt"}],"success":true,"total":4}

{"data":[{"_id":33,"_is_leaf":false,"_parent":4,"company":"ShineTV_cy"},{"_id":30,"_is_leaf":true,"_parent":4,"company":"ShineTV_EPG42"},{"_id":37,"_is_leaf":true,"_parent":4,"company":"ShineTV_10"}],"success":true,"total":3}

刚开始学习EXT,请指教下,谢谢!

相关推荐

    extjs-Ext.ux.form.LovCombo下拉框

    在EXTJS框架中,`Ext.ux.form.LovCombo`是一种自定义组件,它扩展了基本的`Ext.form.field.ComboBox`,提供了更丰富的功能,尤其是针对多选和联动选择的需求。这个组件通常用于创建具有“lov”(即“Look Up Value”...

    Ext.ux.tree.treegrid异步加载

    在ExtJS框架中,`Ext.ux.tree.TreeGrid`组件是一种结合了树形结构与表格显示特性的控件,适用于展示具有层级关系的数据。通过这种组件,用户可以在一个界面上同时查看数据的层次结构以及具体数据内容。 #### 二、...

    extjs4.1-ux.rar

    Extjs4.1多个扩展 1、Ext.ux.aceeditor.Panel 2、Ext.ux.grid.feature.Tileview 3、Ext.ux.upload.Button 4、Ext.ux.toggleslide.ToggleSlide ...注明:在Extjs4.1上是可以使用的,Extjs4.2部分会有问题。

    Ext.ux.UploadDialog.zip

    这个"Ext.ux.UploadDialog.zip"压缩包包含了EXTjs的UploadDialog组件,方便开发者在自己的项目中直接使用。 UploadDialog组件的核心功能是提供一个用户友好的界面,让用户能够选择并上传文件到服务器。这个组件通常...

    Ext.ux.SwfUploadPanel.js

    总的来说,`Ext.ux.SwfUploadPanel.js`是一个强大而灵活的文件上传解决方案,它结合了ExtJS的组件化和SwfUpload的高级上传功能,使得在Web应用中实现多文件上传变得简单易行。然而,随着HTML5技术的发展,现代浏览器...

    Ext.ux.UploadDialog

    Most configuration options are inherited from Ext.Window (see ExtJs docs). The added ones are: url - the url where to post uploaded files. base_params - additional post params (default to {}). ...

    Ext.ux.UploadDialog批量上传文件实例

    Ext.ux.UploadDialog批量上传文件实例是一个基于ExtJS组件库扩展插件的文件上传解决方案,主要针对需要一次性处理多个文件上传的应用场景。ExtJS是一个强大的JavaScript框架,它提供了丰富的用户界面组件,而Ext.ux....

    extjs中Ext.Panel和TreePanel 组件动态加载本地页面数据

    在EXTJS这个强大的JavaScript框架中,`Ext.Panel`和`TreePanel`是两个非常重要的组件,它们被广泛用于构建复杂的用户界面。这篇文章将探讨如何在这些组件中动态加载本地页面数据,以提升用户体验并实现灵活的数据...

    ext 多文件上传控件 Ext.ux.UploadDialog 使用中的问题

    首先,Ext.ux.UploadDialog是一个基于ExtJS框架的组件,它允许用户在一个对话框中选择并上传多个文件。这个组件通常包含一个文件选择输入框、上传按钮、进度条和取消上传的功能。它的主要优势在于能够提供友好的用户...

    Ext JS Notification 插件

    在Ext JS中,“Notification”插件是用于显示通知消息的一个组件,它可以帮助开发者在用户界面上创建吸引人且易于理解的提示信息。本文将深入探讨Ext JS Notification插件的使用方法、功能特性以及如何集成到项目中...

    Extjs4.X下comboboxTree下拉树型菜单,完美支持多选、单选,绝对好用

    在ExtJS 4.x框架中,ComboboxTree是一种特殊的组件,它将传统的下拉框与树形结构结合在一起,提供了一种更为灵活的用户输入方式。这种组件在数据选择上非常实用,尤其当数据层级关系复杂时,可以方便地进行多选或...

    [Ext 3.x + Ext 2.x] 下拉树 Ext.ux.ComboBoxTree

    【Ext 3.x + Ext 2.x 下拉树 Ext.ux.ComboBoxTree】是基于ExtJS框架的一个组件,它结合了下拉框(ComboBox)和树形控件(TreePanel)的功能,提供了一种用户友好的选择界面。在网页应用中,这种控件常用于展示层级...

    ExtJs选中var editor = new Ext.ux.grid.RowEditor详解

    ### ExtJs选中 `var editor = new Ext.ux.grid.RowEditor` 详解 在Web开发领域,特别是使用ExtJs框架进行复杂用户界面构建时,`RowEditor` 是一个非常实用的功能,它允许用户直接在表格行内编辑数据,极大地提高了...

    如何在服务器端 读取Ext.ux.UploadDialog上传的文件?

    在使用 Ext.ux.UploadDialog 进行文件上传时,客户端与服务器端的交互是一个关键环节。Ext.ux.UploadDialog 是一个 ExtJS 框架的扩展组件,它提供了一个友好的用户界面来处理文件上传。在服务器端,我们需要正确解析...

    Ext 3.2的一个TreeGrid

    感谢 Ericzhen 远离颠倒梦想,蕴籍无上清凉 这里引用它的资源 仅作分享 http://www.cnblogs.com/Ericzhen/archive/2012/06/11/2545186.html

    Ext.ux.GoogleChart extjs插件

    "Ext.ux.GoogleChart"就是这样一个插件,它允许开发者在ExtJS应用中集成Google Charts,以展示各种复杂的数据可视化图表。 Google Charts 是Google提供的一种免费服务,它提供了多种图表类型,如柱状图、折线图、...

    ExtJs3.* 分页树 Ext.ux.tree.PagingTreeLoader

    ExtJs 3.x 分页树(Ext.ux.tree.PagingTreeLoader)是一个强大的扩展,它在处理大量数据时尤其有用,因为树形结构通常需要显示大量的层级和节点。这个组件引入了分页功能,允许用户逐步加载树节点,而不是一次性加载...

    Ext.ux 收集

    NULL 博文链接:https://lingf.iteye.com/blog/1188654

    ExtJs4.1 treegrid CRUD 读取、新增、修改、删除

    实现treegrid组件的(CRUD)读取、新增、修改、删除 //设置grid单元格处于编辑状态 selcell:function(arow,acol){ this.editingPlugin.startEditByPosition({row:arow,column:acol}); }, selcell2:function(node,...

    ext.ux.menu.storemenu.zip

    标题 "ext.ux.menu.storemenu.zip" 暗示我们关注的是一个与 ExtJS 框架相关的扩展组件,具体是 `ux.menu.storemenu`。这个扩展可能为 ExtJS 的菜单系统提供了一种新的功能,可能涉及到数据存储和动态加载菜单项。在...

Global site tag (gtag.js) - Google Analytics