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

aen*_*tic 14 extjs4 extjs-mvc

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

问题

您的应用程序可以打开许多不同的视图,其中一些视图本身就是迷你应用程序.另外,用户可能希望打开视图的多个并发副本.

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

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

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

我通过向Component和Controller添加新的原型方法来重构我的应用程序,以允许a)子控制器(我的一些控制器变得非常庞大)和b)专门为它们使用的视图定义存储.模型仍然可以在控制器上定义,只是为了方便处理程序使用,如果你需要做一些事情,比如从服务器上获取记录.

我对MVC的理解会让我相信模型与View更直接相关,而不是Controller.我假设ExtJS 4决定将存储(我认为可以看作是更经典模型的包装器)附加到控制器,以鼓励重复使用加载的数据,并优化远离同一类的多个副本实例化.但是,在我看来,如果打算让用户可以使用许多视图实例,则无法执行此操作.根据我的想法,拥有许多实例是OO框架中的一个重要选项,因此我为什么要逆转趋势并在一些Ext基类上实现原型.(谢谢Ext.implement!).

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

Aci*_*ier 8

我遇到了类似的问题:

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

我想出了一个解决方案基于从煎茶论坛.在一个坚果shell中,几乎所有从视图调度的事件都包含对视图本身的引用.我的控制器控制功能中的处理程序都使用这些来获取对正确视图实例的引用.

为了处理这个所需的同一个商店的多个实例,我从这篇帖子中把这个放在心上:

对于视图上的Store实例或全局实例...取决于需求.如果您打算全球使用,那么将其全局化.如果您只是在视图上需要它,那么将它放在视图上.MVC不是法律,您可以根据自己的需要进行更改.从技术上讲,MVC的Controller部分假设是View和Model部分之间的中间人,但有时候只是不需要.我95%的时间都在视图中创建商店.我给你举个例子......

如果您有产品商店,则可能只需要在网格中引用该商店.这通常不是应用程序的其他部分所必需的.但是,如果你有一个商店来加载国家,我经常需要全局,所以我只需加载一次,然后可以在几个视图中设置/使用该商店.

所以我在视图的initComponent方法中专门创建了与视图实例相关的所需商店.该应用程序确实有一些全局商店,我根据MVC建议创建了商店类.很好地将视图实例存储封装在视图中.然后我只需要一个控制器实例.

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


dbr*_*rin 0

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

“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);
                 }
         });
Run Code Online (Sandbox Code Playgroud)