Extjs 5. Ext.application не является функцией. Почему?

Я получаю сообщение об ошибке в консоли: Ext.application is not a function. Мой файл index.html содержит этот код:

...
<link rel="stylesheet" type="text/css" href="/ext-5.0.1/packages/ext-theme-neptune/build/resources/ext-theme-neptune-all.css" />
<script src="/ext-5.0.1/ext-all-debug.js"></script>    
<script type="text/javascript" src="app.js"></script>    
...

В то время как app.js имеет только этот код, взятый из одной демки:

Ext.application({
name: 'AM',
appFolder: 'app',
launch: function() {
    Ext.create('Ext.container.Viewport', {
        layout: 'fit',
        items: [{
                xtype: 'panel',
                title: 'Users',
                html : 'List of users will go here'
        }]
    });
}
});

ИЗМЕНИТЬ

Кстати, даже запуская "официальную" /ext-5.0.1/examples/app/simple/simple.html получаю ту же ошибку. Почему это?


person Jacobian    schedule 30.07.2014    source источник
comment
ваш код отлично работает на моей стороне, попробуйте здесь fiddle.sencha.com   -  person sakir    schedule 30.07.2014
comment
Вы уверены, что это единственная ошибка? Это объявление обычно существует в глобальном контексте — если есть другая проблема, она может убить всю страницу.   -  person Emissary    schedule 30.07.2014
comment
Ну, что бы я ни делал, я все равно получаю эту ошибку. Но когда перехожу на версию Ext 4.1.1, то все ок. Может это какой-то запрет? Я имею в виду, у вас должна быть коммерческая лицензия, чтобы использовать такое кодирование. Или нет?   -  person Jacobian    schedule 30.07.2014


Ответы (2)


Оберните вызов Ext.application внутри блока Ext.onReady.

// app.js
Ext.onReady(function() {
  Ext.application({
    name: 'AM',
    appFolder: 'app',
    launch: function() {
      Ext.create('Ext.container.Viewport', {
        layout: 'fit',
        items: [{
          xtype: 'panel',
          title: 'Users',
          html : 'List of users will go here'
        }]
      });
    }
  });
})

Причина, по которой это необходимо, кстати, заключается в том, что файлы ext-all-debug.js не содержат всего ExtJS. Он содержит загрузочный код — код, который знает, как получить все остальное. Частью этого «всего остального» является код приложения. Так что, пока у него не будет шанса запуститься, Ext.application не существует.

Упомянутый вами пример портала работает, потому что он использует результат sencha app build - microloader.js. Это загружает полную версию ExtJS (точнее, части, используемые в приложении), и, таким образом, Ext.application уже определен к моменту его использования. (То же самое и с Sencha Fiddle — там вам также не понадобится Ext.onReady)

person Robert Watkins    schedule 30.07.2014
comment
Извините, у вас коммерческая версия продукта или общедоступная? - person Jacobian; 31.07.2014
comment
Ну, обертывание внутри Ext.onReady не дает никакого эффекта - person Jacobian; 31.07.2014
comment
Что ж, попробуем решить глупый вопрос - успешно ли загружается файл /ext-5.0.1/ext-all-debug.js? Другая возможность заключается в том, что, поскольку вы используете ночную сборку, у вас может быть сломанная версия. Попробуйте с выпуском 5.0.0. - person Robert Watkins; 31.07.2014
comment
Да, он успешно загружается, потому что Ext.application is not a function - единственная ошибка, которую я вижу в консоли. Сейчас проверю релиз 5.0.0 - person Jacobian; 31.07.2014
comment
Ну, это действительно странная вещь. Я только что проверил версию 5.0.0 и вот что у меня получилось. Примеры из папки examples/app/ не запускаются по той же причине - Ext.application is not a function, но пример из папки портала запускается нормально. - person Jacobian; 31.07.2014
comment
Хорошо, я только что попробовал простую демонстрацию приложения в примерах и столкнулся с проблемой, которую вы описали. Затем я обновил файл app.js, чтобы вызов Ext.application выполнялся onReady, и это сработало. Я обновляю свой ответ более подробной информацией. - person Robert Watkins; 31.07.2014
comment
Спасибо, сэр! Хотя мой собственный код не работает с этим трюком, код в examples/app/ заработал. Я возьму их как ступеньку. - person Jacobian; 31.07.2014
comment
Кто-то поставил вам минус почему-то, но я проголосовал и проверил ваш ответ как решение. Спасибо еще раз! - person Jacobian; 31.07.2014

Вместо

<script src="/ext-5.0.1/ext-all-debug.js"></script>

Вы должны использовать

<script src="/ext-5.0.1/build/ext-all-debug.js"></script>

Второй содержит все компоненты и классы, как и ожидалось.

person Thomas Lauria    schedule 16.01.2015