Расширение Ext.data.Store

Я пытаюсь централизовать свою конфигурацию хранилищ EXTJS в своем приложении, однако я не могу понять, как это сделать. Я использую ExtJS 4.1.

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

Ext.define('My.store.Abstract', {
    extend: 'Ext.data.Store',
    autoload:false,
    proxy: {
        type: 'ajax', 
        reader: {  
            type: 'json',
            root: 'data',
            totalProperty: 'total',  
            successProperty: 'success', 
            messageProperty: 'message'  
        },
        writer: {  
            type: 'json',
            encode: true, 
            writeAllFields: true, 
            root: 'data',
            allowSingle: false 
        },
        simpleSortMode: true
    }
});

Затем я хотел бы предоставить конкретные вещи для магазина в каждом магазине -

Ext.define('My.store.Products', {
    extend: 'My.store.Abstract',
    storeId: 'Products',
    model: 'My.model.Product',
    proxy: {
        api: {
            create: '/myurl/create',  
            read: '/myurl/index',
            update: '/myurl/update',  
            destroy: '/myurl/delete' 
        }
    }
});

Что я нахожу, так это то, что он просто не ведет себя вообще. Я считаю, что это как-то связано с прокси, но я просто не могу его отследить.

Каков правильный способ сделать это? Я бы предпочел не копировать один и тот же материал конфигурации (из моего абстрактного хранилища) в более чем 350 хранилищах моего приложения. На данный момент это то, что у меня есть, и я думал, что пытаюсь реализовать довольно простую концепцию ... безрезультатно.

Я знаю, что вещи не работают, такие простые, как pageSize или даже автозагрузка ... потому что они вообще не соблюдаются.

Я играл с конструкторами и вызывал родителя.

Любая помощь будет принята с благодарностью.


person Jim Eckels    schedule 10.12.2012    source источник


Ответы (3)


Вы не можете сделать это таким образом, потому что вы ожидаете объединить объекты, чего он просто не сделает.

Вместо этого вы захотите посмотреть на что-то вроде этого (непроверенное):

Ext.define('Base', {
    extend: 'Ext.data.Store',

    autoLoad: false,

    constructor: function(config) {
        // applyIf means only copy if it doesn't exist
        Ext.applyIf(config, {
            proxy: this.createProxy()
        });
        this.callParent([config]);
    },

    createProxy: function() {
        return {
            reader: {
                type: 'json',
                root: 'data',
                totalProperty: 'total',
                successProperty: 'success',
                messageProperty: 'message'
            },
            writer: {
                type: 'json',
                encode: true,
                writeAllFields: true,
                root: 'data',
                allowSingle: false
            },
            simpleSortMode: true
        }
    }
});

Ext.define('Sub', {
    extend: 'Base',

    createProxy: function(){
        var proxy = this.callParent();
        proxy.api = {
            create: 'create',
            update: 'update'
        };

        return proxy;
    }
});
person Evan Trimboli    schedule 10.12.2012
comment
очень хороший пример модуляции вложенных конфигураций для переопределений, спасибо, Эван! - person dbrin; 11.12.2012
comment
Это подход, который я в итоге выбрал. Спасибо за понимание. - person Jim Eckels; 07.02.2013
comment
@JimEckels, так что прими ответ. нажмите на галочку слева от ответа. Благодарю. - person gdoron is supporting Monica; 27.02.2014
comment
У меня это не работает. По какой-то причине свойство API не применяется к прокси. - person Joabe Lucena; 15.08.2016

Вот еще один способ:

Базовый магазин (app/store/Base.js):

Ext.define('Admin3.store.Base', {
    extend: 'Ext.data.Store',
    autoLoad: true,
    autoSync: true
});

Базовый прокси (app/proxy/Base.js):

Ext.define('Admin3.proxy.Base', {
    extend: 'Ext.data.proxy.Ajax',
    alias: 'proxy.base',
    reader: {
        type: 'json',
        root: 'items',
        successProperty: 'success',
        messageProperty: 'message'
    },
    listeners: {
        exception: function(proxy, response, operation){
            console.log(response, operation);
            Ext.Msg.show({
                title: 'Remote Exception',
                msg: typeof operation.getError() === 'string' ? operation.getError() : operation.getError().statusText,
                icon: Ext.Msg.ERROR,
                buttons: Ext.Msg.OK
            });
        }
    }
});

Конкретный магазин (app/store/Users.js):

Ext.define('Admin3.store.Users', {
    extend: 'Admin3.store.Base',
    model: 'Admin3.model.User',
    proxy: Ext.create('Admin3.proxy.Base', {
        api: {
            read: 'data/read.php',
            update: 'data/update.php'
        }
    })
});
person mac    schedule 23.01.2014

Я думаю, что другие ответы здесь могут быть немного сложнее, чем нужно. Начиная с версии 4.0.0, ExtJS имеет Метод Ext.Object.merge(), который позволяет использовать подход, очень близкий к тому, что пытался сделать запрашивающий.

Используя значения, которые имеет спрашивающий, я бы определил свой «абстрактный» магазин следующим образом:

Ext.define("Ext.ux.data.Store", {
    extend: "Ext.data.Store",
    constructor: function(config) {
        var defaults = {
            autoload: false,
            proxy: {
                type: "ajax", 
                reader: {  
                    type: "json",
                    root: "data",
                    totalProperty: "total",  
                    successProperty: "success", 
                    messageProperty: "message"  
                },
                writer: {  
                    type: "json",
                    encode: true, 
                    writeAllFields: true, 
                    root: "data",
                    allowSingle: false 
                },
                simpleSortMode: true
            }
        };
        this.callParent([Ext.Object.merge({}, defaults, config)]);
    }
});

Затем я бы создал свои конкретные магазины следующим образом:

Ext.create("Ext.ux.data.Store", {
    storeId: "ExampleStore",
    model: "ExampleModel",
    autoLoad: true, // This overrides the defaults
    proxy: {
        api: {
            read: "/example/read"  // This overrides the defaults
        }
    }
});

Этот подход также будет работать для нескольких уровней компонентов. Например, вы можете смоделировать хранилище только для чтения:

Ext.define("Ext.ux.data.ReadonlyStore", {
    extend: "Ext.ux.data.Store",
    constructor: function(config) {
        var overrides = {
            proxy: {
                api: {
                    create: undefined,
                    update: undefined,
                    destroy: undefined
                }
            }
        }
        this.callParent([Ext.Object.merge({}, config, overrides)]);  // Note that the order of parameters changes here
    }
});
person jstricker    schedule 06.05.2014