【问题标题】:How to separate a view from a controller?如何将视图与控制器分开?
【发布时间】:2012-01-11 00:02:08
【问题描述】:

我的一位同事在 javascript 中查看了我的代码,并告诉我不应该在控制器中使用视图。相反,我应该使用调解员。我完全迷路了。他要到下周才能有空,所以我在这里。

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

var controller = (function(){

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

})();

我不知道如何将视图与控制器分离并使用中介来处理它们。

谁能给我一个想法或示例代码或概念?

【问题讨论】:

    标签: model-view-controller view controller mediator


    【解决方案1】:

    首先介绍一下 MVC 模式中 Ms、Vs 和 Cs 的角色:

    三个部分:

    Model-View-Controller:

    我们将应用程序/领域不变的本质称为模型(单数)。在面向对象的术语中,这将由一组类组成,这些类对底层问题进行建模和支持,因此它们将趋于稳定并且与问题本身一样长期存在。
    模型(类)应该对与外部世界的连接了解多少?没有,绝对没有。

    型号-View-控制器:

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

    模型-视图-Controller:

    控制器是一个可以让您操作视图的对象。稍微简化一下,控制器处理输入,而视图处理输出。控制器最了解平台和操作系统。视图完全独立于它们的事件是否来自 Microsoft Windows、X Windows 或其他。


    你的同事想告诉你的是:

    下图是 Zend 框架的序列流(近似),Zend 框架是 PHP 的 MVC 框架。

    点击here查看大图。


    观察上图中的 Dispatcher(倒数第三个)。
    对于您的情况,我们只考虑以下内容:

    • Front.php      :如您所见。
    • 调度员    :您的同事提到的调解员。
    • MyController:作为您的控制器。

    你需要做的是:
    如果 View 必须触发一个事件,它不会自己处理该事件。它会将事件连同事件的参数(如果有)一起分派给 Dispatcher

    Dispatcher 现在将

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

    控制器现在将:

    • 为活动做准备。
    • 执行事件。
    • 将结果集(如果有)返回给 Dispatcher

    Dispatcher 现在将:

    • 将结果集(如果有)返回到视图

    视图现在将:

    • 呈现结果集(如果有)并呈现它。

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

    【讨论】:

    • ThinkingMonkey // 谢谢你的详细解答。但是,我在图中看不到视图。查看framework.zend.com/manual/en/…,向下滚动到ErrorController。它还使用控制器内部的视图。
    • @moon 是的,图中没有视图。这就是为什么我要求您将 front.php 视为一个视图。在 MVC 方面存在很多实现差异。 (参考here)。如果要考虑传统模式,views know their model but the model doesn't know its views, the controllers knows their views but the view doesn't know its controller. 所以你所做的并不是错误或不好的做法。
    • @moon 这只是您希望如何调用 view 的偏好。在回答您的问题时,我只是专注于如何将视图与控制器分离并使用中介来处理它们。
    • //我很欣赏你的回答,但它仍然没有意义。如您所知,Zend Framework 在其控制器中使用实际视图,就像我在伪代码中所做的那样。那么问题仍然存在,为什么 Zend Framework 在他们的控制器中使用视图?这与我的问题几乎相同。
    • @moon 正如我所说,它是为了关注点分离并且你所做的并不是错误或不好的做法。Mediator 只是 MVC 中的一个额外模块。您的同事可能建议这样做:他不希望应用程序的核心文件,即 模型、视图、控制器不直接交互。
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2014-06-11
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多