近期在搞extjs4 TreeStore时有一个需求 就是要处理一下后台传过来的json数据然后再显示,看api也没有找到解决的方法 ,最后看源代码在Ext.data.proxy.Server 看到这么一个方法

[javascript] view
plain
copy

  1. extractResponseData: function(response) {
  2. return response;
  3. },

然后我再 proxy 中重写了这种方法

Ext.define("App.store.MenuStore",{
extend:'Ext.data.TreeStore',
model:'App.model.MenuModel',
proxy:{
type:'ajax',
url:app.contextPath + '/base/syresource!doNotNeedSecurity_getMainMenu.action',
reader:"json",
extractResponseData: function(response) {
var json = Ext.loadFilter(Ext.JSON.decode(response.responseText),{parentField : 'pid'});
Ext.each(json,function(record){
if(Ext.isEmpty(record.children)){
record.expanded = false;
record.leaf = true;
}else{
record.expanded = true;
}
});
response.responseText = Ext.JSON.encode(json);
return response
}
},
autoLoad: true
});

大家都喜欢ztree的简单数据结构(扁平pid结构数据集),而Extjs并没有给我们提供,于是仅仅有我们自己动手了。

标准的 JSON 数据须要嵌套表示节点的父子包括关系

比如:
var nodes = [
{name: "父节点1", children: [
{name: "子节点1"},
{name: "子节点2"}
]}
];

简单模式的 JSON 数据仅须要使用 id / pId 表示节点的父子包括关系

比如:
var nodes = [
{id:1, pId:0, name: "父节点1"},
{id:11, pId:1, name: "子节点1"},
{id:12, pId:1, name: "子节点2"}
];

这是我希望转换的json数据

[
{
"iconCls": "ext-icon-application_view_tile",
"id": "xtgl",
"target": "",
"text": "系统管理",
"url": "/welcome.jsp"
},
{
"iconCls": "ext-icon-newspaper_link",
"id": "zygl",
"pid": "xtgl",
"target": "cmp",
"text": "资源管理",
"url": "App.view.ResourceView"
},
{
"iconCls": "ext-icon-tux",
"id": "jsgl",
"pid": "xtgl",
"target": "cmp",
"text": "角色管理",
"url": "App.view.RoleView"
},
{
"iconCls": "ext-icon-group_link",
"id": "jggl",
"pid": "xtgl",
"target": "cmp",
"text": "机构管理",
"url": "App.view.OrganizationView"
},
{
"iconCls": "ext-icon-user_suit",
"id": "yhgl",
"pid": "xtgl",
"target": "cmp",
"text": "用户管理",
"url": "App.view.UserView"
},
]

ExtJs仅仅认识嵌套的json数据。这就须要我们进行转换了。转换的方法例如以下:

Ext.loadFilter= function(data, opt) {
var idField, textField, parentField;
if (opt.parentField) {
idField = opt.idField || 'id';
textField = opt.textField || 'text';
parentField = opt.parentField || 'pid';
var i, l, treeData = [], tmpMap = [];
for (i = 0, l = data.length; i < l; i++) {
tmpMap[data[i][idField]] = data[i];
}
for (i = 0, l = data.length; i < l; i++) {
if (tmpMap[data[i][parentField]] && data[i][idField] != data[i][parentField]) {
if (!tmpMap[data[i][parentField]]['children'])
tmpMap[data[i][parentField]]['children'] = [];
data[i]['text'] = data[i][textField];
data[i]['leaf'] = true;//推断为叶子节点
tmpMap[data[i][parentField]]['children'].push(data[i]);
} else {
data[i]['text'] = data[i][textField];
treeData.push(data[i]);
}
}
return treeData;
}
return data;
}

Extjs4 操作TreeStore 处理proxyAjax 获取的数据的更多相关文章

  1. Linux中Curl命令couldn't connect to host解决方案 php操作Curl(http,https)无法获取远程数据解决方案

    本人在做百度账户第三方登录接口,获取百度token,利用php操作curl post方式发送请求token,出现couldn't connect to host错误.经过调试测试,最后终于成功.回头写 ...

  2. HTML5操作麦克风获取音频数据(WAV)的一些基础技能

    基于HTML5的新特性,操作其实思路很简单. 首先通过navigator获取设备,然后通过设备监听语音数据,进行原始数据采集. 相关的案例比较多,最典型的就是链接:https://developer. ...

  3. 从后台获取的数据渲染到页面中的dom操作

    很多情况下页面dom都是从后台拼接字符串添加生成的新的dom元素,在编辑器中不能看到,只能通过检查看到页面的dom结构,但是这时候会发生一个问题,就是如果使用jQuery无法进行dom操作,事件和方法 ...

  4. 接口自动化(二)--操作Excel获取需要数据

    这一部分的内容记述一下对Excel表格的操作,本实战中的测试用例是由Excel来管理的,因此操作Excel是重要的一部分. 再次贴出这张图,所有的测试用例都在这个sheet内,请求数据真实存放在jso ...

  5. Dapper操作MySQL数据库获取JSON数据中文乱码

    前言 在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正. Dapper获取J ...

  6. .net后台获取DataTable数据,转换成json数组后传递到前台,通过jquery去操作json数据

    一,后台获取json数据 protected void Page_Load(object sender, EventArgs e){  DataTable dt = DBhepler.GetDataT ...

  7. Zookeeper命令行操作(常用命令;客户端连接;查看znode路径;创建节点;获取znode数据,查看节点内容,设置节点内容,删除节点;监听znode事件;telnet连接zookeeper)

    8.1.常用命令 启动ZK服务 bin/zkServer.sh start 查看ZK服务状态 bin/zkServer.sh status 停止ZK服务 bin/zkServer.sh stop 重启 ...

  8. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  9. jdbc java数据库连接 7)获取插入数据的自增长值

    我们创建一个sql表,里面的数据往往都会有自增长值. 那么,我们用jdbc插入数据的时候,要想同时获得这个增长值. 代码: /** * * 这是插入一条数据的同时,获取该数据的则增长列的值(该例子的自 ...

随机推荐

  1. J2SE知识点摘记(二)

    1.    对象的声明 "类名 对象名 = new 类名();"例子:Person P;//先声明一个Person类的对象p p=new Person();//用new关键字实例化 ...

  2. Android开发:自定义GridView/ListView数据源

    http://mobile.51cto.com/android-259861.htm 在开发中,我们常常会遇到比较复杂的GridView/ListView的布局,重新实现BaseAdapter不但能帮 ...

  3. Congos

    http://hi.baidu.com/tag/cognos%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/feeds http://www.blogjava.net/mlh ...

  4. 提高mindmanager 8的启动速度

    提高mindmanager 8的启动速度一连串 发布于:2010-01-13 18:12不少人抱怨mindmanager 8的启动速度较慢,用以下办法配置一下就能解决:1.进入mindmanager ...

  5. C语言入门(19)——C语言的编码风格

    代码风格好不好就像字写得好不好看一样,如果一个公司招聘秘书,肯定不要字写得难看的,同理,代码风格糟糕的程序员肯定也是不称职的.虽然编译器不会挑剔难看的代码,照样能编译通过,但是和你一个团队进行协作的其 ...

  6. Unity3D 物体移动到点击位置

    using UnityEngine;using System.Collections; public class MoveToClick : MonoBehaviour{ public GameObj ...

  7. ln 命令

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...

  8. aix 在线软件包安装 字符集 mysql安装

    http://www.oss4aix.org/download/rpmdb/deplists/ Aix6.1 安装mysql别的我就不扯了,自从Oracle收购sun后 Mysql在Aix Parch ...

  9. Struts2 二、为Action的参数注入值

    为Action参数注入值,主要使用在的场景为,Action的一个参数的值不是固定的是可以改变的,所以不能直接写在Action中,可以通过Struts配置的方式将值配置到Struts中,然后通过注入的方 ...

  10. POJ1042 Gone Fishing

    采用贪心策略. 假设他从1湖泊走到x 湖泊,这还剩下 h*12 - sigma(T1--Tx-1).(单位时间为5分钟).然后再用剩下的时间去钓1-x的湖泊的鱼. 每次都选择最多鱼的湖泊钓. code ...