0

我尝试创建基本控制器并在其中写入:

Ext.define('My.Users.controller.Role', {
    extend      : 'Ext.app.Controller',
    stores       : [
        'Modules', 'ModulesList'
    ],
    models       : [
        'Modules', 'ModulesList'
    ]
});

但是当我尝试为它们使用 getter 时(在这个基类中,或者在它的子类中,比如 My.Users.controller.Group),比如 getModulesStore() 或 getModulesListModel(),我有一个错误,它们不是函数. 在 Firebug 中,我可以看到子类和超类中没有这种方法。我该如何解决?

如何重现此错误的完整说明: 1) 从 Sencha 下载 ExtJS 4.1 GPL

2) 解压压缩包,进入目录 extjs-4.1.0/examples/app/feed-viewer/

3)在文件feed-viewer.html注释行<script type="text/javascript" src="all-classes.js"></script>强制动态加载js文件:现在可以正常编辑项目文件的内容了。

4) 在文件夹 app/controller 中创建名为 Entities.js 的文件,代码如下:

Ext.define('FV.controller.Entities', {
    extend: 'Ext.app.Controller',
    models: ['Shared'],
    stores: ['Shared']
});

5) 在文件 Articles.js 和 Feeds.js 中更改为“FV.controller.Entities”

6)在文件夹 app/model 和 app/store 创建文件 Shared.js 与内容

Ext.define('FV.model.Shared', {
    extend: 'Ext.data.Model',
    idProperty: 'id',
    fields: [
    {
        name: 'id',
        type: 'int'
    },
    {
        name: 'title',
        type: 'string'
    }
    ]
}); 

对于模型和

Ext.define('FV.store.Shared', {
    extend: 'Ext.data.Store',
    model: 'FV.model.Shared',
    proxy: {
        type: 'ajax',
        url: 'test.json',
        reader: {
            type: 'json',
            root: 'item'
        }
    }
});

为商店。

7)最后,例如在Article.js的init方法中尝试console.log(this);在 Firebug 中,您不会获得 getSharedModel() 和 getSharedStore() 方法。

我已将样本上传到http://nekaka.com/d/W1_EOlnPST

4

2 回答 2

2

如果您使用refs属性,则会为视图生成 Getter。

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.app.Controller - 查看“使用参考”部分。

对于商店只需使用this.getStore('Modules')

于 2012-06-16T12:28:05.257 回答
1

models并且stores是配置属性。如果您查看源代码,Ext.app.Controller您会看到在构造函数中创建的 getter。

FV.controller.Articles您的控制器类固有的,但它有自己的modelsstores属性,这些属性将覆盖您自己的基类中的属性。这与您的组件具有配置的方式非常相似height,它将覆盖所有基类的配置(除非基类通过在构造函数或 initComponent 中覆盖它来强制此类配置controller,使用简单配置属性的情况并非如此)。

如果你想让它工作,你的控制器所固有的类必须明确地将基类配置与其新配置合并。同样,与组件相同。

或者(可能是更好的解决方案),而不是将共享模型和存储定义为基类中的配置属性,您可以将它们合并到构造函数获取的配置中。在你的基本控制器类的构造函数中是这样的:

Ext.merge( config, {
    models: ['Shared'],
    stores: ['Shared']
});
于 2012-06-18T10:20:45.577 回答