Extjs4 ExtJS 4 MVC视图和子/子控制器的多个实例困难

Extjs4 ExtJS 4 MVC视图和子/子控制器的多个实例困难,extjs4,extjs-mvc,Extjs4,Extjs Mvc,我在ExtJS4中遇到了MVC模式的问题。至少,我想我有。我已经就这个问题联系了很多人,并且在Sencha论坛上发布了很多次,现在我转向更广泛的受众,希望得到一个灯泡或者一个确认 问题 您的应用程序能够打开许多不同的视图,其中一些视图本身就是小型应用程序。此外,用户可能希望打开视图的多个并发副本 此应用程序是一个单页客户端Javascript应用程序 extjs4mvc模型希望您在应用程序类中定义所有控制器。然后在应用程序加载时初始化这些控制器。控制器跟踪视图、模型和存储 当您多次初始化控制器时

我在ExtJS4中遇到了MVC模式的问题。至少,我想我有。我已经就这个问题联系了很多人,并且在Sencha论坛上发布了很多次,现在我转向更广泛的受众,希望得到一个灯泡或者一个确认

问题

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

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

extjs4mvc模型希望您在应用程序类中定义所有控制器。然后在应用程序加载时初始化这些控制器。控制器跟踪视图、模型和存储

当您多次初始化控制器时,比如说创建一个视图的多个副本,最终会得到两个引用相同数据存储的视图,并在功能上向应用程序事件总线发送重复事件

我重构了我的应用程序,向组件和控制器添加了新的原型方法,以允许a)子控制器(我的一些控制器变得非常庞大)和b)专门为它们使用的视图定义存储。这些模型仍然可以在控制器上定义,只是为了便于处理程序在需要从服务器抓取记录时使用

问题

我对MVC的理解使我相信模型比控制器更直接地与视图相关。我假设ExtJS 4决定将存储(我认为可以看作是更经典模型的包装)附加到控制器上,以鼓励重用加载的数据,并优化同一类的多个副本。然而,在我看来,如果一个人想让一个视图的多个实例可供用户使用,他就不能这样做。在我看来,拥有多个实例是OO框架中的一个重要选择,因此我逆势而上,在一些Ext基类上实现了原型。(谢谢分机!)


使用现成的MVC类并使用提供的setter、getter等,有没有办法让一个视图的多个并发实例加载不同的数据

当然。是什么让你不这么认为的? 下面是创建从窗口组件扩展的自定义视图的示例。您可以从同一控制器多次运行此方法,每次都将获得视图的新实例

“this”指代码在其中运行的控制器:

       this.getRequestModel().load(requestID,{       //load from server (async)
                 success: function(record, operation) {
                        var view = Ext.widget('requestEdit',{
                            title: 'MyRequest '+requestID
                        });
                        var form = view.down('form');
                        form.loadRecord(record);
                 }
         });

我认为,无论有多少视图/模型,您都不需要超过一个控制器实例。请参见此处的功能示例:


如何创建视图?我看不出为什么不能向每个对象传递不同的存储或配置数据。一些代码示例将有助于您的具体操作。例如,我们有一个类似的应用程序,所有的事情都是通过扩展来完成的。所以,如果我们需要网格,我们就运行

Ext.define('MyApp.grids.something',{
extends:'Ext.grid.panel' 
//...
这些类是预定义的。然后,当控制器或视图加载此网格时,它们使用

var grid=Ext.create('MyApp.grids.something',{id:'unique',store:mystore});
如您所见,每次创建同一网格时,我们都可以将不同的配置选项传递给它。我们可以像你一样对待这件事

Ext.create('Ext.grid.Panel');
当然,除了我们预先定义了一些选项,以及一些不可重写的选项,等等


希望这有帮助。

我也遇到了类似的问题:

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

我提出的解决方案是基于Sencha论坛的。在坚果壳中,几乎所有从视图发送的事件都包含对视图本身的引用。控制器的控制函数中的处理程序都使用这些来获取对正确视图实例的引用

为了处理同一个商店的多个实例,我从那篇文章中牢记了这一点:

对于视图上的存储实例或全局实例。。。取决于 需要。如果你打算在全球范围内使用,那么就让它成为全球性的。如果你 只有你需要它在视图上,然后把它放在视图上。MVC是 不是法律,你可以根据自己的需要修改它。技术上 MVC的控制器部分被假定为介于 查看和建模零件,但有时并不需要。我创造 商店95%的时间都在视图中。我给你举个例子

如果你有一个商店的产品,你可能只需要参考 存储在你的网格中。这通常是不需要的其他部分 应用程序。但是,如果您有要加载国家/地区的存储,我 通常需要全局加载,所以我只需加载一次即可 在多个视图中设置/使用该存储

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


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

这可以很容易地做到。您需要遵循以下几条规则:

  • 在应用程序s上加载控制器