"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? Кстати, хак в песочнице не работает, а в моем проекте пашет... почему-то. |
Часовой пояс GMT +3, время: 11:43. |