在Extjs中扩展基本模型时如何覆盖url字段?

时间:2014-09-28 13:27:08

标签: extjs extjs5

我是Extjs的新手,并且正在关注创建模型层次结构的Extjs 5示例: (http://docs.sencha.com/extjs/5.0/core_concepts/data_package.html

我创建了一个基本模型,它使用url字段保存代理。我现在想扩展这个基本模型,只覆盖下面的url部分:

Ext.define('MyPortal.model.Base', {
    extend: 'Ext.data.Model',
        fields: [{
            name: 'id',
            type: 'int'
        }],
        schema: {
            namespace: 'MyPortal.model',  // generate auto entityName
            proxy: {
                type: 'ajax'
                ,url : '/portal-web/{entityName}'
                ,reader: {  
                    type:'json',              
                    rootProperty:'{entityName:lowercase}',
                    idProperty: 'id'
                }
            }
        }   
    });

这是一个儿童模特:

Ext.define('MyPortal.model.Account', {
        extend   : 'MyPortal.model.Base'
        ,fields: [
            {name: 'accountId',  type: 'string'},
            {name: 'name',  type: 'string'}
        ]
        , //add something here to override the url from the base model above?
    });

我尝试在子模型中添加url字段或函数,但忽略了这些。子模型是否可以覆盖父级的URL参数?

谢谢!

2 个答案:

答案 0 :(得分:2)

schema中的proxy选项是Ext5称之为ObjectTemplate的内容。简而言之,它被用作模式模型的默认配置。

您可以在模型本身的proxy配置中覆盖此默认值(一个代理实例将由模型类创建 - 而不是由模型实例创建)。请注意,model class本身并不接受url选项,必须在proxy中设置。

对你而言,这会产生这样的结果:

Ext.define('MyPortal.model.Account', {
    extend   : 'MyPortal.model.Base' // I guess you had a typo here
    ,fields: [
        {name: 'accountId',  type: 'string'},
        {name: 'name',  type: 'string'},
    ]
    // Override proxy URL (the other options of the schema's proxy
    // will be used)
    ,proxy {
        url: 'path/to/accounts'
    }
});

仅供参考,读者没有idProperty选项(所以说the docs),这次是in the model ......

答案 1 :(得分:0)

我有一个稍微不同的问题:我的数据模型是生成的,所以我使用override:来扩展这样的模型类:

Ext.define('app.override.Foo', {
    override: 'app.data.Foo',
    proxy: {url: 'rest/foo',type: 'rest'}
}

此代理覆盖在extjs 5中不起作用(在4.x中运行良好)