Hac*_*tar 6 model-view-controller extjs extjs4.1 sencha-command
在使用Sencha Cmd生成工作区并创建两个不同的应用程序后,我只想运行第一个应用程序,然后单击一个按钮后,它调用第二个应用程序:)就像一个主应用程序调用另一个子应用程序是否有办法做它?谢谢你的帮助
lon*_*ero 18
您可以开发可以一起工作而没有问题的独立模块.这两个概念都没有冲突.
让我在这里分享我的经验.当我们开始我们当前的项目(从头开始)时,还有另外两个团队开发了另外两个应用程序,经过一段时间我们应该将它们"集成"在一个大应用程序中.你不必成为预测结局结果的天才,对吗?当我们听到客户想要更多并行工作(更多团队开发模块)时,事情变得更糟.
第一个想法是使用iframe但是PoC证明这是一个坏主意,所以我们停止了机器并开始设计可插拔架构.我们做得很好,因为目前我们能够轻松地加载以孤立方式开发的模块(我们称之为插件).例如,看看我们的文件夹结构如何:

这是我们设置要加载的模块的元数据:

这有很多好处:
当然,这不是extjs提供的开箱即用的东西,但你可以做到这一点,因为它值得.
所以,简短的回答:你的问题不是应用程序的大小,而是它的结构.像我们一样,按照推荐的MVC模式使用自定义文件夹结构.
更新:
关于插件元数据.应用程序主控制器只有一个责任:加载插件.这是通过以下代码完成的:
discoverPlugins: function () {
var me = this;
Ext.each(plugins(), function (d) {
me.loadPluginController(d.controller);
});
App.History.notifyAppLoaded();
},
loadPluginController: function (controllerName) {
try {
var controller = App.current.getController(controllerName);
controller.init(App.current);
} catch (e) {
console.log(controllerName + ' controller couldn\'t be loaded.' + e);
}
},
Run Code Online (Sandbox Code Playgroud)
并且每个插件控制器都充当调度程序,也就是说,有一个历史组件监听url(在地址栏中),当它发生变化时,通过插件迭代插件,要求处理url.当插件能够处理请求的URL时,该过程结束.
这是"操作"插件的调度程序配置:
constructor: function () {
this.callParent(arguments);
this.router.set({
'!/operations/product/permissions/definition': this.viewPermissionsDefinition,
'!/operations/product/accesslist/create': this.createProductAccessList,
'!/operations/product/accesslist/{id}/edit': this.editProductAccessList,
'!/operations/product/accesslist/{id}': this.viewProductAccessList,
'!/operations/product/accesslist': this.viewProductAccessList,
'!/operations/{...}': this.notFound,
'!/operations': this.root
});
}
Run Code Online (Sandbox Code Playgroud)
这是历史类代码的导航方法:
navigate: function (token) {
var me = this,
handled;
if (token) {
handled = false;
for (var i = 0; i < me.routers.length; i++) {
if (me.routers[i].processToken(token)) {
handled = true;
break;
}
}
if (!handled) {
App.current.fail(404, 'Resource not found.');
}
} else {
App.current.gotoUrl('/servicedesk/search');
}
},
Run Code Online (Sandbox Code Playgroud)
一个重点是插件只有一个共享组件的引用:它们呈现的中心区域:
refs: [
{ ref: 'main', selector: '#center-panel' }
],
Run Code Online (Sandbox Code Playgroud)
此引用由所有插件控制器继承,这些控制器是"AbstractPluginController"的子类.这很重要,因为模块只知道他们的主机.这就是我们可以并行发展的原因.
关于AbstractPluginController,这个类具有一些对所有插件控制器都有用的核心功能,例如,为了在需要时加载所有控制器/视图/模型,而不是在此之前加载,此类实现动态控制器加载如下:
createControllerGetters: function (controllers) {
var me = this;
controllers = Ext.Array.from(controllers);
Ext.Array.each(controllers, function (controllerName) {
var parts = controllerName.split('.'),
idx = parts.indexOf('controller'),
significants = parts.slice(idx + 1),
name = significants.map(function (e) { return Ext.String.capitalize(e); }).join(''),
fn = 'get' + name + 'Controller';
if (!me[fn]) {
me[fn] = Ext.Function.pass(me.getController, [controllerName], me);
}
});
},
getController: function (controllerName) {
this.controllerCache = this.controllerCache || {};
var me = this,
cached = me.controllerCache[controllerName];
if (!cached) {
me.controllerCache[controllerName] = cached = App.current.getController(controllerName);
if (cached) {
cached.init();
cached.on('beforedestroy', function () {
me.controllerCache[ref] = null;
});
}
}
return cached;
},
Run Code Online (Sandbox Code Playgroud)
这允许我们指定模块具有的子控制器列表(因为主控制器只是初始化器和调度器),并允许我们按需创建它们.
controllers: [
'Operations.controller.ProductAccessListViewer',
'Operations.controller.ProductAccessListEditor',
'Operations.controller.ProductAccessListCreator'
],
Run Code Online (Sandbox Code Playgroud)
总结:我认为要点主要是:
我希望这会给你一个想法.有许多细节可以集成它们,但基本上,我想在这里展示的是模块化应用程序可以(或者应该)使用extjs开发,只需要一点点额外的努力.
| 归档时间: |
|
| 查看次数: |
4503 次 |
| 最近记录: |