6

我正在尝试将我的 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 .. 因为它们根本没有被尊重。

我玩过构造函数,并调用父级。

任何帮助将不胜感激。

4

3 回答 3

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;
    }
});
于 2012-12-10T21:38:41.543 回答
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'
        }
    })
});
于 2014-01-23T14:11:14.297 回答
0

我认为这里的其他答案可能比他们需要的要复杂一些。从 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
    }
});
于 2014-05-06T18:46:13.660 回答