扩展Ext.data.Store

时间:2012-12-10 19:17:06

标签: extjs extending extending-classes

我正在尝试将我的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一样基本,甚至是autoLoad ......因为它们根本没有得到尊重。

我玩过构造函数,然后调用父文件。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:10)

你不能那样做,因为你期望合并它不会做的对象。

相反,你会想看看这样的事情(未经测试):

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;
    }
});

答案 1 :(得分:1)

这是另一种方式:

基本商店(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'
        }
    })
});

答案 2 :(得分:0)

我认为这里的其他答案可能比他们需要的要复杂一些。从版本4.0.0开始,ExtJS有一个Ext.Object.merge() method,它允许一种非常接近提问者尝试的方法。

使用提问者拥有的值,我会像这样定义我的“抽象”商店:

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
    }
});