Я не знаю, является ли это правильным способом попытаться заполнить дерево по требованию, но это способ, который я знаю, и я не могу сказать, что официальная документация полезна.
У меня есть дерево, первые узлы которого загружаются из базы данных, пока все хорошо. Затем, если я дважды щелкну на узле, я сделаю это в моем контроллере:
function(item, record, index) {
var selectedId = record.data.idelement;
var newStore = Ext.create('mycomponent.mystore', {
autoDestroy: true,
idparent: selectedId
});
newStore.proxy.extraParams = {idparent: selectedId};
newStore.removeAll(true);
newStore.load();
}
Я могу сказать, что функция load
выбирает нужные данные из базы данных на вкладке сети браузера. Ничего не произошло в представлении, дерево остается прежним. Это мой магазин:
Ext.define('mycomponent.mystore', {
extend: 'Ext.data.TreeStore',
alias: 'store.datatree',
storeId: 'datatree',
model: Ext.define('TreeNode', {
extend: 'Ext.data.Model',
fields: [{
name: 'text',
convert: function(v, r) {
return r.data.text;
}
}]
}),
restful: true,
autoLoad: false,
// autoDestroy: true,
root: {
text: 'Loading...',
id: 'NULL',
expanded: true
},
listeners: {
'load': function(store, records, successful, operation, eOpts) {
var children = [];
for (var i = 0, l = records.length; i < l; i++) {
var x = records[i].data;
var child = {
idelement: x.idelement,
name: x.name,
descript: x.descript,
active: x.activeo,
idparent: x.idparent,
text: x.name,
leaf: x.isleaf,
children: []
};
children.push(child);
}
if (!store.idpadre) {
store.loadData(children, false);
} else {
var tree = Ext.getCmp('mytree');
var oldStore = tree.store;
var idparent = store.idparent;
var node = oldStore.getRootNode().findChild('idelement', idparent, true);
if (node && !node.leaf) {
node.expand();
node.appendChild(
{
idelement: x.idelement,
name: x.name,
descript: x.descript,
active: x.activeo,
idparent: x.idparent,
text: x.name,
leaf: x.isleaf,
children: []
}
);
}
}
}
},
proxy: {
type: 'ajax',
headers: {
'Accept': '*/*',
'Cache-Control': 'no-cache',
'Content-Type': 'application/json',
'Authorization': localStorage.token
},
extraParams: {
'filter[active]': true,
'filter[idparent][null]': 0
},
reader: {
type: 'json',
rootProperty: 'data',
successProperty: 'success'
},
api: {
read: 'myurl',
create: 'myurl',
update: 'myurl',
destroy: 'myurl'
},
autoSave: true
},
constructor: function (config) {
config = Ext.apply({
rootProperty: Ext.clone(this.rootData)
}, config);
this.callParent([config]);
}
});
Также это дает мне эту ошибку:
Uncaught TypeError: Cannot read property 'isVisible' of null
at constructor.onChildNodesAvailable (ext-all-debug.js:109350)
at Object.callback (ext-all-debug.js:8705)
at constructor.onChildNodesAvailable (ext-all-debug.js:110968)
at Object.callback (ext-all-debug.js:8705)
at constructor.onProxyLoad (ext-all-debug.js:111930)
at constructor.triggerCallbacks (ext-all-debug.js:80621)
at constructor.setCompleted (ext-all-debug.js:80589)
at constructor.setSuccessful (ext-all-debug.js:80602)
at constructor.process (ext-all-debug.js:80501)
at constructor.processResponse (ext-all-debug.js:89534)
То, что я пытаюсь сделать в хранилище * Событие 1011 * - это добавить один статический узел как дочерний узел выбранного узла только для тестирования и однажды сделать это, чтобы поместить туда реальные данные из Restapi, но я ' Я не могу этого сделать. По моей логике это должно работать, но это не так, что я делаю не так? Что мне здесь не хватает?