Sencha Touch - не удается найти глобальную переменную в тестовых и производственных сборках.

Кажется, что я не могу получить доступ к глобальной переменной в Ext.application после выполнения производственной или тестовой сборки с помощью Cmd 4. Это происходит во время первого запуска приложения. Я читал другие похожие темы, но там нет ничего нового, что могло бы решить мою проблему по какой-либо причине.

Прежде чем я начал использовать Cmd, я запускал свое приложение с сервера в каталоге приложения, и все работало нормально. У меня не было проблем с другими моими файлами, улавливающими глобальные переменные.

Теперь, когда я перешел на Cmd 4 / ST2.3.1, тестовая и производственная сборки встраиваются в один большой файл app.js. Таким образом, кажется, что когда код, который находится ранее в файле js, вызывает глобальную переменную, он не может ее найти, за исключением консоли:

Uncaught TypeError: невозможно прочитать свойство targetServer, равное undefined

Это происходит при первом запуске приложения, и приложение просто зависает. Индикаторы загрузки даже не снимаются. Я заметил, что код Ext.application находится в конце app.js. Может быть, какой-то код запускается до полной загрузки приложения?

В моем app.js у меня есть следующее. Это последняя строка в моем app.js в строке 76623. Глобальная переменная, которая не читается, - "targetServer":

Ext.application({
    name: 'qxtapp',
    targetServer: 'http://192.168.1.70:8080'
    ...
});

Один из моих магазинов выглядит так. Вот где я получаю исключение. Приведенный ниже код находится ранее в моем app.js, в строке 70742:

Ext.define('qxtapp.store.AccountsListStore', {
    extend  :  Ext.data.Store ,
    xtype   : 'accountsListStore',
    config: {
        model: 'qxtapp.model.AccountsList',
        data: [
            { accountName: qxtapp.app.targetServer+'/account_one' },
        //                 ^ Causes exception- cannot read property "targetServer" 
        //                   of undefined
            { accountName: qxtapp.app.targetServer+'/account_two' },
            ...
        ]
    }
})

Есть идеи, что мне здесь не хватает? Любая помощь приветствуется.

Спасибо!


person rc1    schedule 13.04.2014    source источник
comment
Привет, Мохаммад! Вы уже читали эту тему? Может быть, это может быть полезно: sencha.com/forum/   -  person monstergold    schedule 14.04.2014


Ответы (1)


Это ошибка порядка операций.

В разработке ваш код Ext.application () (в app.js) запускается первым, потому что любые другие классы (например, qxtapp.store.AccountsListStore) загружаются динамически после браузер физически читает app.js.

Но когда вы используете Cmd для объединения ваших классов, результирующий единственный JS-файл сразу полностью читается браузером. Что происходит, так это то, что все методы Ext.define () запускаются ПЕРЕД Ext.application () ... поэтому qxtapp.app не выполняется пока не назначен.

Самый простой способ обойти эту проблему - использовать настоящую глобальную переменную, а не просто свойство, назначенное глобальному объекту «app» (в app.js):

var TARGET_SERVER = 'http://192.168.1.70:8080';

Ext.application({
    //...
})

А в других твоих классах ...

Ext.define('qxtapp.store.AccountsListStore', {
    extend  :  Ext.data.Store ,
    xtype   : 'accountsListStore',
    config: {
        model: 'qxtapp.model.AccountsList',
        data: [
            { accountName: TARGET_SERVER + '/account_one' }
            //...
        ]
    }
});
person arthurakay    schedule 14.04.2014
comment
Привет, Артур, спасибо за разъяснения. Хотя в итоге я использовал одноэлементный класс для хранения своих переменных, ваше объяснение было ясным, простым и очень полезным для тех, кто только что перешел на Cmd. Спасибо! - person rc1; 15.04.2014