Как создать статические параметры для использования в хранилищах данных с остальным прокси

У меня есть приложение ExtJS 5.1.2, которое использует во всем приложении глобальный набор параметров конфигурации, определенный в app_dir/app/Application.js, который выглядит так:

launch: function () {
    Ext.Loader.setConfig({enabled: true});

    // Static parameters
    cardioCatalogQT.config = {

        mode: 'test', // switch to control use of staging or production server
        //protocol: 'https://',
        protocol: 'http://',
        //host: 'production_server',
        //host: 'test_server,
        host: '127.0.0.1:5000',
        apiGetQ: '/get_query/',
        //apiGetQ: '/api/get_query/',
        apiWriteQ: '/remote_query_put',
        apiReadQ: '/remote_query_get',
        //apiMedsMenu: '/api/meds',
        //apiMedsMenu: '/meds',
        remove: 'none'
    };

    // TODO - Launch the application

    Ext.onReady(function () {


    });
}

Таким образом, у меня есть только одно место для изменения параметров, составляющих url в вызовах Ajax, (в данном случае protocol, host и apiGetQ, например, дать mr возможность установить url = cardioCatalogQT.config.protocol + cardioCatalogQT.config.host + cardioCatalogQT.config.apiGetQ), чтобы в одном месте изменить адрес сервера с разработка -> тестирование -> производство, вместо того, чтобы искать все ссылки в приложении.

Однако из-за того, как загружаются ExtJ, я не могу использовать эти параметры конфигурации в хранилищах данных, использующих прокси-серверы для отдыха, поскольку эти хранилища, похоже, загружаются перед элементами в Ext.Loader.

Например, у меня есть следующий магазин:

Ext.define('cardioCatalogQT.store.Diagnoses', {
    extend: 'Ext.data.Store',
    alias: 'store.Diagnoses',
    config:{
        model: 'cardioCatalogQT.model.Diagnosis',
        storeId: 'Diagnoses',
        autoLoad: true,

        proxy: {
            type: 'rest',
            url: 'http://127.0.0.1:5000/menu/diagnoses',
            //url: 'http://test_server/menu/diagnoses',
            //url: 'https://prod_server/api/menu/diagnoses',
            reader: {
                type: 'json',
                rootProperty: 'menu_test'
            }
        }
    }
});

Итак, когда я перехожу от среды тестирования к среде разработки, например, я должен явно изменить n разных ссылок для URL-адреса в моих n магазинах, которые имеют прокси-серверы для отдыха.

Есть ли способ определить объект конфигурации, чтобы я мог использовать его для этих магазинов? Я просмотрел несколько примеров предварительного загрузчика, но, похоже, не было задокументировано никаких вариантов использования для глобального объекта конфигурации, также я пытался реализовать маску загрузки в предварительном загрузчике, но это действительно испортило поведение моего приложения.


person horcle_buzz    schedule 11.02.2016    source источник


Ответы (2)


arrow_upward
3
arrow_downward

Я делаю так, как предлагает @Alexander, однако я предпочитаю одноэлементный способ. Больше ExtJs/MVC нравится. Итак, чтобы завершить, я делюсь своей версией:

/**
 * @class
 */
Ext.define("MyApp.config.Config", {
    alternateClassName: [
        'MyApp.config'
    ],
    singleton: true,

    constant: {

        // ... whatever constant you need to put here

    },

    constructor: function() {
        var constant = this.constant;

        //
        // here, if you need to process some stuff
        // for example calculate some constant
        // which depend of other constant
        //


        return constant;
    }
});

Требовать в своем приложении

// Be sure to require your class prior
// to your app classes
Ext.define('MyApp.Application', {
    extend: 'Ext.app.Application',

    requires: [
            'Ext.app.*',
            // ext stuff ...
            'MyApp.config.Config',
            // myApp stuff ...
    ]

    // ...

});

Пример использования:

Ext.define('MyApp.store.MyStore', {
    // ...

    proxy: {
        type: 'rest',
        url: MyApp.config.remoteUrl
    }
})
person Psycho    schedule 11.02.2016
comment
Мне тоже нравится этот синглтонный подход намного больше. Куда в структуре каталогов это попадает (это каталог MyApp_dir/app/config)? - person horcle_buzz; 11.02.2016
comment
Ага, точно! И, например, в моем приложении у меня есть несколько файлов конфигурации. - person Psycho; 11.02.2016
comment
@psycho, @alexander Я также использую этот класс конфигурации singleton стратегии, но просто для того, чтобы создать обсуждение, что вы думаете о доступе к прототипу (на случай, если нам не нужно обрабатывать пользовательские вещи над константами) как: Admin.view.myview.Mymodule.prototype.myconstant - person jamesjara; 11.02.2016
comment
@jamesjara, почему бы и нет, это тоже работает! Однако я нашел его менее элегантным, более подробным (чтобы ввести весь путь), и по какой-то причине, если вы переместите свой файл в другую папку и хотите сохранить согласованное пространство имен для ExtJ, вам нужно будет изменить все ссылки на ваша постоянная... Я действительно предпочитаю одноэлементный способ с параметрами alternateClassName! - person Psycho; 12.02.2016

arrow_upward
1
arrow_downward

У нас были похожие проблемы, поэтому мы поместили наш глобальный объект ConnectionSettings в тег script, который находится в index.html, перед Ext.

<script type="text/javascript">
ConnectionSettings = {
    ...
    ...
};
</script>
<!-- The line below must be kept intact for Sencha Cmd to build your application -->
<script id="microloader" ...

Таким образом, объект доступен везде, где он нам нужен в нашем коде Ext.

person Alexander    schedule 11.02.2016