2013-05-07 3 views
3

У меня есть json, у которого есть 3 основных пункта. В первом мензунктоне есть одно подменю, поэтому menupoint 1 не является «листом». Когда я нажимаю на папку Symbol, все меню (весь json-файл) снова находится под подменю. Так что его бесконечность. Может кто-нибудь помочь мне с этим, пожалуйста? СПАСИБО!!ExtJS4: TreePanel Store загружает файл json снова и снова Itemclick

Вот мои файлы:

приложение/данные/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); 
} 

});

ответ

2

Это мне потребовалось некоторое время, чтобы понять, но ваше дерево на самом деле работает как задумано :)

Я создал скрипку для того, чтобы визуализировать: http://jsfiddle.net/dbrin/auBTH/

По существу каждый раз, когда вы расширяете узел в tree в Поведение по умолчанию - загрузить дочерние узлы. Это означает, что store отправит запрос GET на сервер, указанный свойством url proxy. Он отправляет идентификатор узла, на который вы нажали, чтобы развернуть, чтобы серверная сторона использовала этот идентификатор для запуска запроса.

Как вы сказали, вы всегда возвращаете тот же набор данных, и это именно то, что вы видите: каждый раз, когда вы расширяете узел дерева, к дереву добавляется идентичный набор данных в качестве дочерних элементов расширенного узла. Один из узлов, которые вы возвращаете, расширяется .. и поэтому вы можете снова повторить этот процесс :)

EDIT: при дальнейших размышлениях я нашел отдельную проблему, которая заставляет узел искать дочерние узлы на сервере, а не уже выбранные узлы под ним. Проблема заключается в том, как определяется читатель. В вашем исходном коде вы устанавливаете json reader для анализа данных, возвращаемых с сервера, с указанием свойства root, установленного на результат.
Хотя это работает на начальной загрузке данных, это также влияет на то, как читаются узлы детей. По существу root config переопределяет значение по умолчанию детей config.Я исправил свой предыдущий пример, изменив свойство root на детей - http://jsfiddle.net/dbrin/auBTH/4/ теперь он работает как ожидалось.

+0

Спасибо за ваш ответ! Да, правильно, но как я могу это предотвратить? Я не хочу загружать один и тот же контент снова и снова! – Zwen2012

+0

У вас есть другие данные для загрузки? если это так, вам нужно отправить свойство id для каждого узла, а затем обработать получение данных для этого идентификатора узла на стороне сервера. – dbrin

+0

У меня есть только этот json-файл. Можете ли вы показать мне пример с этим узлом и чем загрузить его ?! – Zwen2012

0

Есть ли дети из дерева Json "leaf: true"?

Может быть, это проблема ...

- EDIT:

Я вижу, что у вас есть значение листа.

Может быть может быть это:

'children':[ 

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

Да, есть множество дополнительных запятых, которые будут затормозить браузер IE, и они должны быть исправлены. Однако это не причина неожиданного поведения. См. Мое редактирование в ответе выше. – dbrin

0

Я могу подтвердить, что это помогает. Хитрость в формате JSON

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

проблемой является массив узлов, во-первых под «результаты» и в следующем разделе «детей». Они должны быть одинаковыми, и используется в конфигурации корня в прокси

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


root: 'result' 

Михал

Смежные вопросы