ExtJS4:TreePanel Store通过Itemclick一次又一次地加载json文件

时间:2013-05-07 15:38:38

标签: javascript json tree extjs4 extjs-mvc

我有一个json,有3个主要的menupoints。在第一个menupoint,有一个子菜单,所以menupoint 1不是'叶子'。当我单击文件夹符号时,整个菜单(整个json文件)再次位于子菜单下。所以它的无限。请有人帮我这个吗?谢谢!!

以下是我的文件:

应用/数据/ tree.json

{
'result':
    [
        {
            "text": "Point1",
            'children':[
                {
                    "text": "SubPoint1",
                    'leaf':true
                },
            ]
        },
        {   "text": "Point2",
            'leaf':true
        },
        {
             "text": "Point3",
             'leaf':true
        },

]

}

查看/ TreeMenu.js

Ext.define('App.view.TreeMenu', {
extend: 'Ext.tree.Panel',
alias: 'widget.treemenu',
title:'Title',
store: 'TreeMenu'

});

商品/ TreeMenu.js

Ext.define('App.store.TreeMenu', {
extend: 'Ext.data.TreeStore',
requires: 'App.model.TreeMenu',
model: 'App.model.TreeMenu',
proxy: {
    type: 'ajax',
    url: 'app/data/tree.json',
    reader: {
        type: 'json',
        root: 'result'
    }
}

});

模型/ TreeMenu.js

Ext.define('App.model.TreeMenu', {
extend: 'Ext.data.Model',
fields: [
    { name: 'name', type: 'int', leaf:false, text:'name'},
    { name: 'value', type: 'string', leaf:false, text:'value'},
]

});

控制器/ TreeMenu.js

Ext.define('App.controller.TreeMenu', {
extend: 'Ext.app.Controller',
views: ['TreeMenu'],
models: ['TreeMenu'],   
stores: ['TreeMenu'],
onLaunch: function() {
    var treeStore = this.getTreeMenuStore();
    treeStore.load({
        //callback: this.onStationsLoad,
        scope: this
    });
},
refs: [{
    selector: 'tree',
    ref: 'treemenu'
}],
init: function() {
    this.control({
        'treemenu': {
            itemclick : this.treeItemClick  
        }
    });

},
treeItemClick : function(view, record) {
    console.log(record);
}

});

3 个答案:

答案 0 :(得分:2)

我花了一段时间才意识到,但你的树实际上正在按设计工作:)

我创建了一个可视化的小提琴:http://jsfiddle.net/dbrin/auBTH/

基本上每次在tree中展开节点时,默认行为都是加载该节点的子节点。这意味着store将向proxy url属性指定的服务器发送GET请求。它发送您单击的节点的id以进行扩展,以便服务器端使用该id运行查询。

正如您所说,您总是返回相同的数据集,这正是您所看到的:每次展开树节点时,相同的数据集将作为展开节点的子节点附加到树中。您返回的其中一个节点是可扩展的...因此您可以再次重复该过程:)

编辑:进一步想到我发现了一个单独的问题,使得节点在服务器上查找子节点而不是下面已经获取的子节点。问题在于如何定义读者。在原始代码中,您将json reader设置为解析从服务器返回的数据,并指定root属性设置为结果。 虽然这适用于初始加载数据,但它也会影响子节点的读取方式。基本上root配置会覆盖默认的子级配置。我更正了上一个示例,将root属性更改为 children - http://jsfiddle.net/dbrin/auBTH/4/现在它按预期工作。

答案 1 :(得分:0)

Json树的任何孩子都有" leaf:true"

也许是问题......

- 编辑:

我看到你有叶子值。

也许可以这样:

'children':[

                {
                    "text": "SubPoint1",
                    'leaf':true
                }-->, <------------------------- ERASE final comma.
            ]

答案 2 :(得分:0)

我可以证实它有帮助。诀窍是json格式

var data = {
"result": [{
    "text": "Point1",
        "children": [{

问题是节点数组首先在“结果”下,然后在“子”下。这些必须相同,并在代理

中的根配置中使用
    var data = {
"result": [{
    "text": "Point1",
        "result": [{


root: 'result'

米甲