Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   "paths processed": true (https://javascript.ru/forum/extjs/56202-paths-processed-true.html)

khusamov 04.06.2015 12:33

"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". Которая сама собой говорит для чего она нужна. Но это недокументированная возможность. Хотелось бы знать, как официально это делать?

khusamov 04.06.2015 12:36

Для наглядности:

Файл 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, 
	...
});

khusamov 04.06.2015 12:41

Было бы логично написать прямо в index.html нечто такое:

Ext.application("MyApp.Application", {
	folderApp: "path/to/app"
});


Но увы, метод Ext.application() такой финт не поддерживает.

Так же не работает и просто создание экземпляра класса своего приложение с попыткой задать тот же folderApp.

Или как вариант, если Ext.app.Application не игнорировал был созданное до него пространство приложения, то все работало без хаков.

siber-biber 04.06.2015 17:48

http://docs.sencha.com/extjs/5.1/5.1...-cfg-appFolder ?

khusamov 05.06.2015 04:09

Он переписывает эту опцию на app. Несмотря на то, что пространство уже было определено.

nohuhu 08.06.2015 08:17

Вы когда в код смотрели, чего ж недосмотрели? Надо либо appFolder указать в классе Application, либо уж тогда и передавать его в конфиге Ext.application, чего стесняться:

Код:

Ext.define('MyApp.Application', {
    extend: 'Ext.app.Application',
    appFolder: 'foo/bar'
});

Ext.application('MyApp.Application');

Или:

Код:

Ext.application({
    name: 'MyApp',
    appFolder: 'foo/bar'
});

И ещё на всякий случай, в документации есть ссылки view source для каждого метода. Вот посмотрите, как Ext.application работает: http://docs.sencha.com/extjs/5.1/5.1...od-application.

А вот всякие недокументированные штуки лучше не трогать, боком может выйти. Я помню, что когда этот кусок MVC рефакторил, таких чудесатых чудес насмотрелся, что диву даёшься. Гремучая смесь асинхронной и синхронной загрузки классов, "декларативное" подтягивание Views/Models/Stores из контроллеров с совершенно невнятной схемой именования классов, и т.д. Оно очень хрупкое, не лезьте туда. :(

khusamov 08.06.2015 22:46

Ну знаете.... ))) я даже и не думал что appFolder нужно в своем классе зачем-то определять. Ведь на момент определения класса путь к приложению не определен. Он определен на момент создания экземпляра.

Ладно, попробую это сделать. А недоглядел возможно...

nohuhu 09.06.2015 03:56

А в классе и не обязательно, я ж показал. :)

На самом деле всё это выглядит очень странно, согласен. Ларчик открывается просто: сперва было кривое API Ext.application(), потом мы начали его выпрямлять и упёрлись рогом в обратную совместимость. Посмотрите на код Ext.application, он малость на голову чудесатый - а всё потому, что глобальные контроллеры могут мудрить с подгрузкой классов и делают это, сволочи, в обход стандартных механизмов поиска зависимостей. :(

В общем, грустно и стыдно там. Не смотрите туда…

khusamov 09.06.2015 13:19

для вас он чудесатый, для меня лохматый ибо в этом лохматом лесу я почти безвылазно весь день нахожусь... Меня там удивляет, что многие классы написаны вопреки концепции config, extend и прочим... То есть вопреки своим же принципам. Из-за этого очень усложняется анализ.

Чуть позже выложу сюда результаты своей работы с этим appFolder. Надеюсь от "paths processed": true удасться избавиться раз и навсегда.

khusamov 04.08.2015 13:43

Возобновляю больную тему...

Создал код в песочнице: 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.