3

我有一个 json,它有 3 个主菜单点。在第一个菜单点中,有一个子菜单,因此菜单点 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);
}

});

4

3 回答 3

2

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

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

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

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

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

于 2013-05-08T05:21:48.470 回答
0

Json 树的任何孩子都有“叶子:真”吗?

也许是问题所在...

- 编辑:

我看到你有叶子价值。

也许可以是这样的:

'children':[

                {
                    "text": "SubPoint1",
                    'leaf':true
                }-->, <------------------------- ERASE final comma.
            ]
于 2013-05-08T12:33:02.853 回答
0

我可以确认它有帮助。诀窍是json格式

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

问题是节点数组首先在“结果”下,然后在“孩子”下。这些必须相同并且在代理的根配置中使用

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


root: 'result'

迈克尔

于 2014-03-12T17:44:02.233 回答