我想动态地在控制器中添加视图和存储。所以,我有这个:
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()
或类似的东西来获取getters
和setters
的{{1}}。
您怎么看?
编辑@asgoth:
使用stores
时,如果控制器不存在,Ext-JS会为您创建一个。那是100%的工作,因为当我this.getController("nameOfController");
我正在获取数据时(文档也说明了这一点)。 :)
答案 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;
}
请注意,此变体不会向任何数组参数添加值,而是覆盖任何现有的参数!
另请注意,您的所有控制器都需要从具有此方法的控制器继承。