Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript extjs4mvc设计思想_Javascript_Model View Controller_Extjs_Extjs4.1_Extjs Mvc - Fatal编程技术网

Javascript extjs4mvc设计思想

Javascript extjs4mvc设计思想,javascript,model-view-controller,extjs,extjs4.1,extjs-mvc,Javascript,Model View Controller,Extjs,Extjs4.1,Extjs Mvc,我还在学习Extjs和mvc,所以我有一个设计问题,我相信有人能回答我。我的问题是: 我有两个控制器处理两个不同的视图。根据用户类型调用两个控制器中的任何一个来渲染正确的视图。所以在我的例子中,如果用户是admin,那么他们将获得基于凭据的admin视图,如果用户是标准用户,那么他们将获得标准视图。决策逻辑应该放在app.js中,还是应该有另一个控制器来决定调用哪个控制器 我想到的一个方法是: 管理员控制器 Ext.define('adminController', { // ha

我还在学习Extjs和mvc,所以我有一个设计问题,我相信有人能回答我。我的问题是:

我有两个控制器处理两个不同的视图。根据用户类型调用两个控制器中的任何一个来渲染正确的视图。所以在我的例子中,如果用户是admin,那么他们将获得基于凭据的admin视图,如果用户是标准用户,那么他们将获得标准视图。决策逻辑应该放在app.js中,还是应该有另一个控制器来决定调用哪个控制器

我想到的一个方法是:

管理员控制器

Ext.define('adminController', {

      // handles admin 
})
Ext.define('adminController', {

    // handles admin 
})
标准用户控制器

Ext.define('standardController', {

      // handles standard 
})
Ext.define('standardController', {

    // handles standard
})
App.js

   Ext.application({
   name: 'MTK',
   autoCreateViewport: true,

     if(admin) {
       controllers: ['adminController']
     }
     else(std){
       controllers: ['standardController']
     }
});
另一个想法:

管理员控制器

Ext.define('adminController', {

      // handles admin 
})
Ext.define('adminController', {

    // handles admin 
})
标准用户控制器

Ext.define('standardController', {

      // handles standard 
})
Ext.define('standardController', {

    // handles standard
})
主控制器

Ext.define('mainController', {

   if(admin){
      call adminController
   } 
   else(std){
      call standardController
   }
})
我不会在前端这样做(至少不会太多)。我想您应该能够在用户登录时了解用户角色,所以

对我来说,我是这样做的,但我必须说我有一个更复杂的ACL,我不会用后端拒绝访问的模块或视图来打扰用户

我使用这两种方法:

  • 成功登录后重新加载/重定向到应用程序视图(后端!)。服务器知道用户会话返回的内容
  • 成功登录后返回配置,其中包含下一步需要的信息(可能只是控制器或其他一些类)
这两种方法都可以减少代码、加快加载速度并简化调试


我希望这为您指明了正确的方向。

有趣的问题,我同意@sra的观点,即通过客户端逻辑实现这一点可能不是正确的方法,尽管这并不是说它不起作用

在我一直在开发的一个应用程序中,我们使用了定义所有控制器的方法,这些控制器可以在“导航”样式的控制器中调用,也可以不调用。这是唯一一个我们直接实例化的,然后基于第一个默认值,然后是直接交互,我们选择呈现适当的控制器和视图,这有点像@sra建议的第二种方法

我认为sra的第一种方法在总体上是合理的,但当您可能有一个视图作为管理员应该是可编辑的,作为用户应该是只读的时,问题就来了。在这种情况下,您不希望编写两个视图


有一件事我没有尝试过(但这个问题让我想!)就是返回a)基于服务器端逻辑的稍微不同的模型,如“用户”或“readonlyuser”,然后将其弹出到同一个视图中(以避免需要两个视图),或者b)返回一个更复杂的模型,其中每个数据属性都带有一个“可编辑”标志。这可以用来呈现不同的字段,或者在应用程序中呈现不同模式的字段……我知道这并不能回答问题,但我对你选择的方法和你想要报告的任何发现感兴趣

我认为正如sra正确指出的那样,让服务器向您发送有关登录用户类型的正确信息。在客户端,让一个控制器决定渲染哪个视图。这应该是处理登录页面的同一控制器。卡片视图是可用于此目的的布局。呈现页面后,让另一个控制器处理该视图中触发的事件

而且任何方式控制器都不应该执行视图工作的渲染部分
仅将控制器用于对视图中触发的事件作出反应

我已经有了登录重定向。我想我应该已经提到了,但无论如何,我有一个会话,我可以获取用户的ldap信息。所以我想我可以使用另一个控制器来决定渲染哪个视图。@rob当然可以,但我不会对用户角色或访问前端控制器的权限做太多决定。您应该在服务器端解决这些问题,正如我所说的,在登录后重定向一个视图,该视图会针对每个角色进行设置,或者将角色化信息返回到登录cmp下一步要加载的内容与同一个模型的不同输出有关:实际上,我在第一部分中就是这么做的,但一开始就有点复杂。但我可以告诉你,它工作起来很有魅力,而且开箱即用,因为它完全集成在ACL中。从一个特定的实现角度来看,你是如何选择输出模型的?可能是视图响应的每个字段都带有“可编辑”标志的模型?或者选择属性“名称”(呈现为文本框)和“readonlyname”(呈现为显示字段?),视图只拾取它找到的字段?我们在Ext中最常见的问题是以ro/rw模式呈现视图,以及如何满足这一需求,非常有兴趣了解有关主题的任何想法,我将尝试更详细地解释它:我首先将每个实体视为一个模块(前端作为后端)。这意味着每个都至少有自己的后端控制器(有些只在前端有模型/商店)。在数据下面,控制器还可以返回基于用户ACL的前端类,并由缓存系统支持以减少加载时间。ACL是它的一部分,因为它的设计便于用户维护(例如,无需配置)。这适用于延迟加载和完整的应用程序加载。