如何将视图与控制器分开?

时间:2012-01-11 00:02:09

标签: model-view-controller view controller mediator

我的一位同事用javascript审查了我的代码并告诉我不应该在控制器中使用视图。相反,我应该使用调解员。我完全迷失了。他将在下周才开放,所以我在这里。

在我的应用程序中,我在控制器(伪代码)中初始化一个视图,如下所示。

var controller = (function(){

   return {
      init: function()
      {
          this.view = new View("template");
          this.view.render();
      }
   }

})();

我不知道如何将视图与控制器分开,并使用调解器来处理它们。

有谁可以请给我一个想法或示例代码或概念?

1 个答案:

答案 0 :(得分:3)

首先谈谈Ms,Vs& amp;的角色。 MVC模式中的Cs:

这三部分:

Model - 视图 - 控制器:

  

我们将调用应用程序/域的不变本质,模型(以单数形式)。在面向对象的术语中,这将包括一组模型和支持底层问题的类,因此它们将趋于稳定并且与问题本身一样长寿。
  模型(类)应该知道多少与外界的联系?没什么,绝对没有。

模型 - View - 控制器:

  

对于给定的情况,在给定的版本中,将有一个或多个与模型的接口,我们将其称为视图(复数)。   在面向对象的术语中,这些将包含一组类,它们为我们提供了“窗口”(通常是实际的窗口)。

模型 - 视图 - Controller

  

控制器是一个允许您操纵视图的对象。过度简化了一点,控制器在视图处理输出时处理输入。控制器拥有最丰富的平台和操作系统知识。视图与其活动是来自Microsoft Windows,X Windows还是其他任何内容完全无关。


你的同事试图告诉你的是:

下面的图片是与Zend框架有关的序列流程(近似),它是PHP的MVC框架。

点击here可获得更大的图片 Zend Framework calls


观察上图中的Dispatcher(倒数第3个)。
让我们只考虑以下情况:

  
      
  • Front.php:作为你的观点。
  •   
  • 调度员:你的同事提到的调解员。
  •   
  • MyController:作为你的控制器。
  •   

你需要做的是:
如果 View 必须触发事件,它将不会自行处理事件。它将事件发送到 Dispatcher 以及事件的参数(如果有的话)。

Dispatcher 现在

  
      
  • 寻找能够处理此类事件的控制器。
  •   
  • 创建控制器
  •   
  • 将事件连同参数(如果有)一起传递给控制器​​。
  •   

控制器现在:

  
      
  • 准备活动。
  •   
  • 执行活动。
  •   
  • 将结果集(如果有)返回 Dispatcher
  •   

Dispatcher 现在将:

  
      
  • 将结果集(如果有)返回 View
  •   

查看现在:

  
      
  • 渲染结果集(如果有)并显示它。   
  •   

为什么需要这么做?
To keep the roles segregated and clear