Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Опять у меня непонятки с билдом (https://javascript.ru/forum/extjs/62242-opyat-u-menya-neponyatki-s-bildom.html)

XAPuTOH 05.04.2016 14:57

И у меня вопрос.
Как сделать динамический new?

Т.е. задача. Есть меню. у кототорого в настройках прописан код.
при нажатии котроллер делал Ext.create('Путь. путь' + код + "Main")

Соответственно Ext.create('Путь. путь' + код + "Main") нужно поменять
Попробовал new Путь. путь[ код ].Main
Ошибка ровно та же. Если целиком путь прописываю( т.е. не динамически) то работает

Infarch 05.04.2016 15:47

eval?

nohuhu 05.04.2016 22:29

Ext.widget() это полезная функция как раз для таких случаев, которые описывает XAPuTOH: когда имя класса или xtype становится известно только на этапе выполнения кода.

Примерно вот так:

Код:

var lightingType = Ext.isDay() ? 'sun' : 'moon';

var lightSource = Ext.widget({
    xtype: lightingType,
    ...
});

Или даже вот так:

Код:

var className = globalFunctionThatReturnsClassName();

var widget = Ext.widget({
    xclass: className,
    ...
});

Конечно же в подобных случаях можно использовать и Ext.create(), это будет вполне оправданно, поскольку оператор new не принимает строчные значения.

Однако я всё же рекомендую использовать Ext.widget() по двум причинам: а) эта функция более гибкая и умеет принимать xtype вместо имени класса, б) для стандартизации. Ext.create() имеет слишком размытую семантику, лучше избегать этой функции в коде даже для динамических случаев. Ext.widget() же однозначно говорит "создай мне объект по динамической информации".

Также рекомендую использовать xtype вместо прямого именования классов в коде. Это даст возможность сделать код более декларативным, что вообще очень полезно и сильно облегчает жизнь. Я когда-то давно написал на эту тему статью на StackOverflow, эта информация всё ещё актуальна: http://stackoverflow.com/questions/1...81965#18281965

XAPuTOH 06.04.2016 05:55

Похоже у меня что то с настройками. Ext.widget() тоже не работает.

Везде ошибка:
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check [url]https://xhr.spec.whatwg.org/[/url].
GET [url]http://192.168.20.110/.js?_dc=20160406074105[/url] 404 (Not Found)
VM1137:3 Uncaught TypeError: c is not a constructor


Ошибка в куске кода индекс файла в разделе <script id="microloader">

nohuhu, где и что посмотреть? в app.json вроде все как надо. Уверен что какая то незначительная ошибочка.

XAPuTOH 06.04.2016 09:04

В общем победил!
Была у меня в панеле такая настроечка:
layout:{
        type: 'border',
        padding: 5
    },


Когда я для теста прописал ручками создание компонента и у меня заработало. Я заметил предупреждение:[Ext.Loader] Synchronously loading 'Ext.layout.container.Border';

Заметил но особо значения не придал.

Потом начал проводить разные эксперименты по выявлению причин и выяснил. что не грузится только определенный вид панелей.

В котором как раз layout ='border'

В итоге я попробовал прописать его:
requires: [
        'Admin.*',
        'Ext.layout.container.Border'
    ],


И вуаля. Все заработало.

Вот такие пироги.

nohuhu 06.04.2016 21:18

Как я и говорил: не хватало класса Ext.layout.container.Border, а динамический загрузчик не мог сформировать для него правильный URL, поскольку нет манифеста и неоткуда взять информацию о пути и имени файла.

Прописывайте все зависимости в requires и будет вам счастье.

XAPuTOH 07.04.2016 07:48

Тут вопрос как узнать зависимость.
Почему он Ext.layout.container.Border не знает, а Ext.layout.container.Fit знает?

nohuhu 07.04.2016 20:41

Потому что fit layout активно используется и внутри фреймворка, например Ext.panel.Table (предок Ext.grid.Panel) имеет зависимость от Ext.layout.container.Fit. Поэтому если вы используете Grid где-либо в вашем приложении, то все его зависимости будут включены автоматически.

А вот border layout внутренне нигде не используется, поэтому зависимость от него нужно указывать явно.

XAPuTOH 11.04.2016 08:58

Понял! Спасибо за ответы!


Часовой пояс GMT +3, время: 10:04.