动态地在控制器中添加视图和存储 - Ext-JS 4.1.1a

时间:2012-12-30 10:57:12

标签: javascript extjs

我想动态地在控制器中添加视图和存储。所以,我有这个:

Ext.define('App.controller.MyController', {
    extend: 'Ext.app.Controller',
    stores: ['App.store.Users'],
    views: ['App.view.Users.Index'],

我正在使用以下方式动态创建此控制器:

var controller = this.getController("Users");

如何动态添加商店和视图,例如:

var controller = this.getController(moduleID);

controller.stores = [];
controller.views = [];

controller.stores.push('App.store.Users');
controller.views.push('App.view.Users.Index');

但是当我这样做时,它不起作用。控制台告诉我Ext无法“从未定义缓冲”,所以我认为我必须使用Ext.apply()Ext.merge()或类似的东西来获取getterssetters的{​​{1}}。

您怎么看?

编辑@asgoth:

使用stores时,如果控制器不存在,Ext-JS会为您创建一个。那是100%的工作,因为当我this.getController("nameOfController");我正在获取数据时(文档也说明了这一点)。 :)

1 个答案:

答案 0 :(得分:1)

您没有那么多选择,因为在实例化控制器时需要准备好阵列。默认情况下,这只会发生一次,因为它应该由Ext.app.Application控制器(实例)管理。

首先,您不能在此处使用getController方法,因为它不接受任何其他配置。因此,最简单的解决方案是实现您自己的getController方法,稍微重命名以避免覆盖。

这是一个例子:

getControllerInstance: function(name, cfg) {
    var me = this.application,
        controllers = me.controllers,
        controller = controllers.get(name);

    if (!controller) {
        controller = Ext.create(me.getModuleClassName(name, 'controller'), Ext.ApplyIf({
            application: me,
            id: name
        },cfg);

        controllers.add(controller);
        if (me._initialized) {
            controller.doInit(me);
        }
    }

    return controller;
}

请注意,此变体不会向任何数组参数添加值,而是覆盖任何现有的参数!

另请注意,您的所有控制器都需要从具有此方法的控制器继承。