Ниже вы увидите, что я получаю исключение JavaScript с представлением MVC, которое я создал в приложении Sencha ExtJS MVC. У меня есть другое представление MVC, которое расширяет «Ext.tree.Panel», который читает простой объект JSON вместо извлечения данных через прокси-сервер Ext.Direct и серверный стек .NET, но единственное, что отличается, — это реализация прокси и конечно, наша логика контроллера MVC. В статической (JSON) реализации наш прокси определяется в модели. В динамической (Ext.Direct) реализации наш прокси определяется в магазине. Файл JavaScript TreeStructures.js (store) запрашивается бесконечное количество раз, пока браузер не выйдет из строя. См. ниже для этого исключения.
Я очень сомневаюсь, что это проблема Ext.Direct, потому что другие магазины отлично работают с этой архитектурой. Я вижу исключение [Ext.Loader], но не понимаю, почему оно повторяется с каждым новым запросом TreeStructures.js. Или где реализовать что требуется. Насколько я понимаю, app.js определяет контроллеры. Затем контроллер определяет модели, которые он сохраняет. И Viewport определяет и создает экземпляры других представлений MVC. Мои «другие взгляды» - это представления дерева. И представление реализует хранилище.
Кроме того, команда Sencha Cmd «сборка приложения sencha» не работает. Обычно мое приложение компилируется без каких-либо проблем, поэтому в хранилище или конфигурации MVC определенно не хватает чего-то, что необходимо для этого динамического дерева.
Исключение в консоли JavaScript:
[Ext.Loader] Synchronously loading 'MyApp.store.TreeStructures'; consider adding Ext.require('MyApp.store.TreeStructures') above Ext.onReady
Браузер аварийно завершает работу с этим исключением JavaScript:
Примечание. Файл JavaScript TreeStructures.js (store) запрашивается бесконечное количество раз, пока в браузере не произойдет сбой со следующим:
Uncaught RangeError: Maximum call stack size exceeded
Ошибки Sencha Cmd (после вызова команды «sencha app build»):
[ERR] failed to find meta class definition for name MyApp.store.TreeStructures
[ERR] def was null
[ERR] C2008: Requirement had no matching files <MyApp.store.TreeStructures> -- unknown-file:-1
Реализация статического дерева (считывает объект JSON для получения данных):
Ext.define('MyApp.store.Categories', {
extend : 'Ext.data.TreeStore',
model : 'MyApp.model.Category',
autoLoad : true,
root : {
text : 'All',
alias : '',
expanded : true
}
});
Ext.define('MyApp.model.Category', {
extend: 'Ext.data.Model',
fields: [
{ name: 'alias', type: 'auto' },
{ name: 'text', type: 'auto' }
],
proxy: {
type: 'ajax',
url: 'data/categories.json'
}
});
Ext.define('MyApp.controller.ConceptTreeReadonly', {
extend : 'Ext.app.Controller',
stores: ['Categories'],
models: ['Category'],
refs : [{
ref: 'categories',
selector: 'view-west'
}],
});
Реализация динамического дерева (использует стек на стороне сервера для получения данных):
Ext.create('MyApp.store.TreeStructures', {
extend: 'Ext.data.TreeStore',
model : 'MyApp.model.TreeStructure',
proxy: {
type: 'direct',
directFn: Concept_Tree_Structure.read,
reader: {
root: 'data'
}
},
root: {
text: 'Concept Tree',
id: 'root',
expanded: false
//children: []
},
autoLoad: false
});
Ext.define('MyApp.model.TreeStructure', {
extend: 'Ext.data.Model',
xtype: 'model-tree-structure',
fields: [
{ name: 'text' }, // string
{ name: 'id' }, // Int32 type: 'int'
{ name: 'expanded' }, // boolean
{ name: 'leaf' }, // boolean
{ name: 'children' } // List<TreeStructure>
]
});
Ext.define('MyApp.controller.ConceptTreeController', {
extend : 'Ext.app.Controller',
stores: ['TreeStructures', 'Concepts'],
models: ['TreeStructure', 'Concept'],
refs : [{
ref: 'concept-tree',
selector: 'view-concept-tree'
}],
init : function() {
this.getConceptsStore().load({
params: {
start: 0,
limit: 10,
foo: 'bar'
}
});
this.getTreeStructuresStore().load({
params: {
start: 0,
limit: 10,
foo: 'bar'
}
});
}
});