一个ExtJS应用程序调用另一个ExtJS的APP(An Extjs App Calling ano

2019-07-05 16:48发布

生成使用煎茶cmd并创建两个不同的应用程序工作区后,我只是想运行的第一个应用程序,然后点击一个按钮后,它会调用第二应用:)像一个主要的应用程序调用另一个子应用程序有没有办法做到它? THX您的帮助

Answer 1:

您可以开发分离的模块,可以没有任何问题共同努力。 这两个概念没有冲突的。

让我在这里分享我的经验。 当我们在我们目前的项目启动(从临时)还有另外两个团队在开发这一段时间后,我们应该只是一个大的应用“集成”他们另外两个应用程序。 你没有必要将预测结果结束一个天才,对吧? 当我们听到客户希望更多的并行工作(更多的团队在开发模块)事情变得更糟。

使用I帧的第一个想法,但在PoC证明这是一个坏主意的话,我们停止了机器,并开始设计一个可插入式架构。 我们这样做是很好,因为我们目前能够加载模块(我们称之为插件)孤立地开发容易。 例如,看一看我们的文件夹结构的样子:

而这正是我们设定的模块,我们要加载的元数据:

这有很多优点:

  • 模块可以并行开发的,
  • 模块可以测试分离的,
  • 模块可以动态加载,启用或禁用

当然,这不是ExtJS的提供开箱即用,但你可以做到这一点,因为它的价值。

所以,答案很简单:你的问题是不是application's大小,但它的struture代替。 按照建议的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);
    }
},

和每一个插件控制器充当调度程序,这是有一个历史组件监听的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
    });
} 

这是历史类代码导航方法:

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');
    }
},

一个重要的一点是插件只需要一个共享的组件的引用:在那里它们被呈现的中心区域:

refs: [
    { ref: 'main', selector: '#center-panel' }
],

该参考文献通过它们是“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;
},

这允许我们指定子控制器的列表(因为主控制器仅仅是一个初始化和调度)的模块了,并允许我们根据需要创建它们。

controllers: [
    'Operations.controller.ProductAccessListViewer',
    'Operations.controller.ProductAccessListEditor',
    'Operations.controller.ProductAccessListCreator'
],

总结:我认为主要点是这些:

  1. 模块鸵鸟政策必须了解主机应用程序什么。
  2. 通过链接导航/通信,多
  3. 通过使用元数据的主机进行集成(插件可以公开额外的元数据太)
  4. 控制器的延迟加载(他们有自己的看法的东西)

我希望这给你一个想法。 有很多细节的一些技巧来整合他们,但基本上,我想在这里展示的是一个模块化的应用程序可以(或应该)开发与只是一个额外的努力,小ExtJS的。



Answer 2:

本主题之前已经长大。 点击这里,查看建议: 使用一个以上的控制器的ExtJS 4 MVC



文章来源: An Extjs App Calling another Extjs APP