"paths processed": true
Мне пришлось дописывать вот такую хитрую инструкцию:
Ext.define("MyApp.Application", { extend: "Ext.app.Application", ... "paths processed": true, // хитрая инструкция ... }); чтобы была возможность задавать путь к пространству MyApp вне класса, например в index.html. Дело в том, что на сервере, когда я формирую файл index.html, мое ExtJS-приложение может быть где угодно быть прописанным, и сервер должен в index.html прописать путь к папке app. Я это делаю инструкцией: Ext.Loader.setPath("MyApp", "path/to/app"); Но в классе MyApp.Application путь перезаписывается на просто 'app' (по сути выполняет Ext.Loader.setPath("MyApp", "app");). То есть, класс Ext.app.Application попросту игнорирует уже созданное setPath() пространство в вышеупомянутой инструкции. И я поковыряв Ext обнаружил эту хитрую опцию "paths processed". Которая сама собой говорит для чего она нужна. Но это недокументированная возможность. Хотелось бы знать, как официально это делать? |
Для наглядности:
Файл index.html ... <script>Ext.Loader.setPath("MyApp", "path/to/app");</script> <script src="path/to/app.js"></script> ... Файл path/to/app.js Ext.application("MyApp.Application"); Файл path/to/app/MyApp.js Ext.define("MyApp.Application", { extend: "Ext.app.Application", ... "paths processed": true, ... }); |
Было бы логично написать прямо в index.html нечто такое:
Ext.application("MyApp.Application", { folderApp: "path/to/app" }); Но увы, метод Ext.application() такой финт не поддерживает. Так же не работает и просто создание экземпляра класса своего приложение с попыткой задать тот же folderApp. Или как вариант, если Ext.app.Application не игнорировал был созданное до него пространство приложения, то все работало без хаков. |
|
Он переписывает эту опцию на app. Несмотря на то, что пространство уже было определено.
|
Вы когда в код смотрели, чего ж недосмотрели? Надо либо appFolder указать в классе Application, либо уж тогда и передавать его в конфиге Ext.application, чего стесняться:
Код:
Ext.define('MyApp.Application', { Код:
Ext.application({ А вот всякие недокументированные штуки лучше не трогать, боком может выйти. Я помню, что когда этот кусок MVC рефакторил, таких чудесатых чудес насмотрелся, что диву даёшься. Гремучая смесь асинхронной и синхронной загрузки классов, "декларативное" подтягивание Views/Models/Stores из контроллеров с совершенно невнятной схемой именования классов, и т.д. Оно очень хрупкое, не лезьте туда. :( |
Ну знаете.... ))) я даже и не думал что appFolder нужно в своем классе зачем-то определять. Ведь на момент определения класса путь к приложению не определен. Он определен на момент создания экземпляра.
Ладно, попробую это сделать. А недоглядел возможно... |
А в классе и не обязательно, я ж показал. :)
На самом деле всё это выглядит очень странно, согласен. Ларчик открывается просто: сперва было кривое API Ext.application(), потом мы начали его выпрямлять и упёрлись рогом в обратную совместимость. Посмотрите на код Ext.application, он малость на голову чудесатый - а всё потому, что глобальные контроллеры могут мудрить с подгрузкой классов и делают это, сволочи, в обход стандартных механизмов поиска зависимостей. :( В общем, грустно и стыдно там. Не смотрите туда… |
для вас он чудесатый, для меня лохматый ибо в этом лохматом лесу я почти безвылазно весь день нахожусь... Меня там удивляет, что многие классы написаны вопреки концепции config, extend и прочим... То есть вопреки своим же принципам. Из-за этого очень усложняется анализ.
Чуть позже выложу сюда результаты своей работы с этим appFolder. Надеюсь от "paths processed": true удасться избавиться раз и навсегда. |
Возобновляю больную тему...
Создал код в песочнице: https://fiddle.sencha.com/#fiddle/rj5 Я прописал путь к приложению: appFolder: "/my/path/to/app" Но загружает он контроллер совсем по другому пути: https://fiddle.sencha.com/app/controller/Root.js И как тут можно выкрутиться без хака "paths processed": true? Кстати, хак в песочнице не работает, а в моем проекте пашет... почему-то. |
в сенчу зарепортили?
|
А это разве проблема Ext? nohuhu сказал что должно работать. Возможно что я напутал там...
|
Тема не закрыта. Не ясно как все-таки правильно делать! Как правильно задать путь к классу приложения.
Код в песочнице https://fiddle.sencha.com/#fiddle/rj5 Я задал путь к приложению: appFolder: "/my/path/to/app" Но контроллер Root почему-то загружается с другой папки. Это видно в консоли: https://fiddle.sencha.com/app/controller/Root.js |
Цитата:
Цитата:
А в вашем случае, поскольку конфиг, переданный в Ext.application(), не наследует Kitchen.Application, то и пути не подставляются правильно. Я уже говорил ведь, что Ext.application() чудесатое? Ну вот вы и наткнулись на очередное подтверждение. В общем, ещё более настоятельно рекомендую не лезть в дебри и просто пользоваться инструментами так, как они должны быть использованы. Примерно так: // app.js Ext.application({ extend: 'Kitchen.Application', name: 'Kitchen', appFolder: "/path/to/app", launch: function() { console.log("launch in Ext.application"); } }); // /path/to/app/Application.js Ext.define("Kitchen.Application", { extend: "Ext.app.Application", controllers: ["Root"], init: function() { console.log("Application init"); }, launch: function() { console.log("launch in Kitchen.Application"); } }); // /path/to/app/controller/Root.js Ext.define('Kitchen.controller.Root', { extend: 'Ext.app.Controller', init: function() { console.log('Root controller init'); } }); В песочницу всё это добро загонять лениво, уж извините. Пятницо вечер. :) |
Часовой пояс GMT +3, время: 13:44. |