И у меня вопрос.
Как сделать динамический new? Т.е. задача. Есть меню. у кототорого в настройках прописан код. при нажатии котроллер делал Ext.create('Путь. путь' + код + "Main") Соответственно Ext.create('Путь. путь' + код + "Main") нужно поменять Попробовал new Путь. путь[ код ].Main Ошибка ровно та же. Если целиком путь прописываю( т.е. не динамически) то работает |
eval?
|
Ext.widget() это полезная функция как раз для таких случаев, которые описывает XAPuTOH: когда имя класса или xtype становится известно только на этапе выполнения кода.
Примерно вот так: Код:
var lightingType = Ext.isDay() ? 'sun' : 'moon'; Код:
var className = globalFunctionThatReturnsClassName(); Однако я всё же рекомендую использовать Ext.widget() по двум причинам: а) эта функция более гибкая и умеет принимать xtype вместо имени класса, б) для стандартизации. Ext.create() имеет слишком размытую семантику, лучше избегать этой функции в коде даже для динамических случаев. Ext.widget() же однозначно говорит "создай мне объект по динамической информации". Также рекомендую использовать xtype вместо прямого именования классов в коде. Это даст возможность сделать код более декларативным, что вообще очень полезно и сильно облегчает жизнь. Я когда-то давно написал на эту тему статью на StackOverflow, эта информация всё ещё актуальна: http://stackoverflow.com/questions/1...81965#18281965 |
Похоже у меня что то с настройками. 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 вроде все как надо. Уверен что какая то незначительная ошибочка. |
В общем победил!
Была у меня в панеле такая настроечка: layout:{ type: 'border', padding: 5 }, Когда я для теста прописал ручками создание компонента и у меня заработало. Я заметил предупреждение:[Ext.Loader] Synchronously loading 'Ext.layout.container.Border'; Заметил но особо значения не придал. Потом начал проводить разные эксперименты по выявлению причин и выяснил. что не грузится только определенный вид панелей. В котором как раз layout ='border' В итоге я попробовал прописать его: requires: [ 'Admin.*', 'Ext.layout.container.Border' ], И вуаля. Все заработало. Вот такие пироги. |
Как я и говорил: не хватало класса Ext.layout.container.Border, а динамический загрузчик не мог сформировать для него правильный URL, поскольку нет манифеста и неоткуда взять информацию о пути и имени файла.
Прописывайте все зависимости в requires и будет вам счастье. |
Тут вопрос как узнать зависимость.
Почему он Ext.layout.container.Border не знает, а Ext.layout.container.Fit знает? |
Потому что fit layout активно используется и внутри фреймворка, например Ext.panel.Table (предок Ext.grid.Panel) имеет зависимость от Ext.layout.container.Fit. Поэтому если вы используете Grid где-либо в вашем приложении, то все его зависимости будут включены автоматически.
А вот border layout внутренне нигде не используется, поэтому зависимость от него нужно указывать явно. |
Понял! Спасибо за ответы!
|
Часовой пояс GMT +3, время: 10:04. |