Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 05.04.2016, 14:57
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

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

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

Соответственно Ext.create('Путь. путь' + код + "Main") нужно поменять
Попробовал new Путь. путь[ код ].Main
Ошибка ровно та же. Если целиком путь прописываю( т.е. не динамически) то работает
Ответить с цитированием
  #12 (permalink)  
Старый 05.04.2016, 15:47
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

eval?
Ответить с цитированием
  #13 (permalink)  
Старый 05.04.2016, 22:29
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

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
Ответить с цитированием
  #14 (permalink)  
Старый 06.04.2016, 05:55
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Похоже у меня что то с настройками. 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 вроде все как надо. Уверен что какая то незначительная ошибочка.
Ответить с цитированием
  #15 (permalink)  
Старый 06.04.2016, 09:04
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

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


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

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

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

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

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


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

Вот такие пироги.
Ответить с цитированием
  #16 (permalink)  
Старый 06.04.2016, 21:18
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

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

Прописывайте все зависимости в requires и будет вам счастье.
Ответить с цитированием
  #17 (permalink)  
Старый 07.04.2016, 07:48
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Тут вопрос как узнать зависимость.
Почему он Ext.layout.container.Border не знает, а Ext.layout.container.Fit знает?
Ответить с цитированием
  #18 (permalink)  
Старый 07.04.2016, 20:41
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

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

А вот border layout внутренне нигде не используется, поэтому зависимость от него нужно указывать явно.
Ответить с цитированием
  #19 (permalink)  
Старый 11.04.2016, 08:58
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Понял! Спасибо за ответы!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HELP!!! У меня проблема с соц. сетью Вконтакте, причиною является "JavaScript error" Mixa Общие вопросы Javascript 1 14.07.2012 14:42
Простой сценарий определения текущего времени у меня в браузере почему-то не работает WitaliG Общие вопросы Javascript 2 02.08.2010 22:05