0

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

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()orExt.merge()或类似的东西来获取getterssettersfor stores

你怎么看?

编辑@asgoth:

当你使用this.getController("nameOfController");控制器时,如果控制器不存在,Ext-JS 会为你创建一个。这是 100% 有效的,因为当我console.log(controller);获取数据时(文档也这么说)。:)

4

1 回答 1

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

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

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

于 2012-12-30T12:00:45.157 回答