extjs4 - ExtJS 4 MVC 多个 View 实例和子/子 Controller 困难

标签 extjs4 extjs-mvc

我在 ExtJS 4 中遇到了 MVC 模式的问题。至少,我认为我遇到了。在与多个人接触过这个问题,并在 Sencha 论坛上多次发帖后,我现在转向更广泛的受众,希望得到一个灯泡或确认。

问题

您的应用程序能够打开许多不同的 View ,其中一些本身就是迷你应用程序。此外,用户可能希望打开一个 View 的多个并发副本。

此应用程序是一个单页客户端 Javascript 应用程序。

ExtJS 4 MVC 模型希望您在 Application 类中定义所有 Controller 。然后在应用程序加载时初始化这些 Controller 。 Controller 跟踪 View 、模型和存储。

当您多次初始化 Controller A 时,例如创建多个 View 副本,您最终会得到两个引用相同数据存储的 View ,并在功能上将重复事件发送到应用程序事件总线。

我通过向 Component 和 Controller 添加新的原型(prototype)方法来重构我的应用程序,以允许 a) 子 Controller (我的一些 Controller 变得非常庞大)和 b) 专门为它们使用的 View 定义存储。模型仍然可以在 Controller 上定义,只是为了便于处理程序在您需要执行诸如从服务器获取记录之类的操作时使用。

问题

我对 MVC 的理解让我相信模型与 View 的关系比 Controller 更直接。我假设 ExtJS 4 决定将存储(我认为可以被视为更经典模型的包装器)附加到 Controller ,以鼓励重用加载的数据,并优化同一个类的多个副本实例化.然而,在我看来,如果一个人打算让一个 View 的许多实例可供用户使用,那么就无法做到这一点。在我看来,拥有多个实例是 OO 框架中的一个重要选项,因此我逆势而上并在一些 Ext 基类上实现了原型(prototype)。 (谢谢Ext.implement!)。

有没有办法让 的 View 有多个并发实例?加载不同的数据使用开箱即用的 MVC 类并使用提供的 setter、getter 等?

最佳答案

我遇到了类似的问题:

考虑一个 CRM 类型应用程序的选项卡面板,它为每个客户打开一个 View 的新实例。并且说选项卡 View 包含 3 或 4 个行编辑网格面板,用于与与该客户端相关的不同数据集合进行交互。

我想出的解决方案是基于 this从 Sencha 论坛。简而言之,几乎所有从 View 调度的事件都包含对 View 本身的引用。我的 Controller 控制函数中的处理程序都使用这些来获取对正确 View 实例的引用。

为了处理为此所需的同一商店的多个实例,我从该帖子中牢记这一点:

For the Store instance on the view or a global one... depends on the needs. If you are going to use globally then make it global. If you only are going to need it on the view then put it on the view. MVC is not a law, you can change it to fit your needs. Technically the Controller part of MVC is suppose to be the middle man between the View and Model parts but sometimes that's just not needed. I create the Store in the view 95% of the time. I'll give you an example...

If you have a Store for products, you probably only need to reference that Store in your Grid. That usually isn't needed for other parts of the application. However, if you have a Store to load countries, I often need it globally so I only have to load it once and can then set/use that Store in several views.



所以我只是在 View 的 initComponent 方法中创建了与 View 实例相关的所需存储。该应用程序确实有一些我按照 MVC 建议创建为存储类的全局存储。将 View 实例存储封装在 View 中效果很好。然后我只需要一个 Controller 实例。

为了具体回答您的问题,目前没有 ExtJS 官方建议或配置来处理使用相同存储构造函数的同一 View 的多个实例。我花了一些时间寻找类似的东西,我发现最好的是他们的一位论坛版主的推荐。

关于extjs4 - ExtJS 4 MVC 多个 View 实例和子/子 Controller 困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8302678/

相关文章:

extjs4 - 如何打包(最小化)extjs 4应用程序

javascript - 在 ExtJS MVC session 期间存储用户信息的正确方法

ExtJS MVC、动态加载和 i18n

javascript - Extjs 4.1 加载后从组合框中删除元素

extjs - 以编程方式隐藏边框布局区域内的组件

javascript - Extjs - 可调整浏览器大小的面板

model-view-controller - Ext JS 4 - 理解 this.control、选择器和事件处理

extjs - 如何将GeoExt3添加到Extjs 6 MVVM体系结构?

extjs - 使用 ExtJS 4.x 捕获 CTRL+S 跨浏览器并避免浏览器操作

extjs - 在extjs中创建箭头键事件