【问题标题】:MVC vs. Flux ? Bidirectional vs. Unidirectional?MVC 与通量?双向与单向?
【发布时间】:2016-01-31 13:42:09
【问题描述】:

查看下图(解释 MVC),我看到了单向数据流。

那么为什么我们认为 MVC 在证明 Flux 合理的同时具有双向数据流?

【问题讨论】:

标签: model-view-controller reactjs flux


【解决方案1】:

Real and Pure MVC 是单向的。从粘贴在问题中的维基百科图表中可以清楚地看出。

十多年前,当 Apache Struts 等服务器端框架实现了一种称为模型视图展示器 (MVP) 模式的 MVC 变体时,它们使每个请求都通过控制器,每个响应都通过控制器返回。每个人都继续称它为 MVC。由于 Web 的固有性质,如果视图不发送请求或更新,模型中的任何更改都无法传播到视图。所以纯MVC没有实现。而是实现了 MVP。

几年前,当 Angular、Ember、Knockout 等框架在前端实现 MVC 时,他们实现了另一种 MVC 变体,称为模型视图视图模型 (MVVM) 模式,很少有人继续称它为 MVC。 (很少有人意识到术语并不重要,因此将其称为 MVW(W 代表任何东西)),他们都没有实现纯 MVC。

React 诞生时,他们趁机实现了纯 MVC(不是 MVP 或 MVVM),并将其重命名为 Flux,几乎没有什么变化。我觉得 Flux 是 MVC 的另一种变体。尽管 Flux/React 团队说它不是 MVC,但我看到两种架构之间存在很多奇偶性 - Flux 和 MVC。

【讨论】:

    【解决方案2】:

    因为在 Javascript 框架中,MVC 不能按照您描述的方式工作。 UI 通常与模型进行双向通信,如下所示:

    1. 用户类型进入视图输入
    2. MVC 框架绑定 onchange() 来更新模型。
    3. Ajax 请求引入了新的模型数据。
    4. MVC 框架更新视图输入的值以匹配模型。

    在 Flux 架构中,UI 只会将带有类型和关联数据的独立操作触发到调度程序,然后调度程序会更新模型,就像任何后台 ajax 方法更新模型一样。

    参考: http://www.thesoftwaresimpleton.com/blog/2013/03/23/client-side-mvc/

    “客户端 MVC 与服务器端 MVC 完全不同”

    “我们正在两个对象之间建立双向通信......”

    "简而言之,我们将 firstName 属性的值连接在一起 将 Person 对象的值转换为输入的 value 属性。”

    http://guides.emberjs.com/v1.10.0/object-model/bindings/

    Ember.js 中的绑定可以与任何对象一起使用,不只是在 视图和模型

    【讨论】:

    • 您可以使用以下等式进行双向和单向:1) 控制器 -> 视图 2) 控制器 -> 模型 3) 视图 模型
    【解决方案3】:

    我是一名嵌入式开发人员,我在我的应用程序中使用 MVC 模式。我的应用程序非常小,并且我已将架构设置为几乎单向的 MVC。但是,我阅读了这篇文章,解释了客户端 MVC,以及关于 MVC 和 FLUX 之间差异的一些想法。

    参考: http://www.christianalfoni.com/articles/2015_08_02_Why-we-are-doing-MVC-and-FLUX-wrong

    传统的MVC

    |------|  request   |------------|  request   |-------|
    |      | ---------> |            | ---------> |       |
    | VIEW |  response  |            |  response  |       |
    |      | <--------- |            | <--------- |       |
    |------|            |            |            |       |
                        | CONTROLLER |            | MODEL |
    |------|  request   |            |  request   |       |
    |      | ---------> |            | ---------> |       |
    | VIEW |  response  |            |  response  |       |
    |      | <--------- |            | <--------- |       |
    |------|            |------------|            |-------|
    

    通量

     COMPONENTS          ACTION CREATORS           STORES
    
        |----------------------<<<<-------------------|
        |                                             |
    |------|            |------------|            |-------|
    |      |  request   |            |  request   |       |
    | VIEW | ---------> |            | ---------> | MODEL |----
    |      |            |            |            |       |   |
    |------|            |            |            |-------|   |
                        | CONTROLLER |                        |
    |------|            |            |            |-------|   |
    |      |  request   |            |  request   |       |   |
    | VIEW | ---------> |            | ---------> | MODEL |   |
    |      |            |            |            |       |   |
    |------|            |------------|            |-------|   |
       | |                                           |        |
       | |--------------------<<<<-------------------|        |
       |----------------------<<<<----------------------------|
    

    【讨论】:

    【解决方案4】:

    有些人采用术语 MVC 来指代 others had pointed out were not pure MVC 的 JavaScript 框架,但它是一种变体,可以称为 MVP(主干)、MVVM(Angular 1)或更广泛的 MV*(另见 @ 987654324@).

    Facebook introduced Flux 时,他们compared it to the issues with MVVM/MVP/MV*,但混淆了使用术语 MVC。

    对于观看此视频的纯 MVC 开发人员来说,Facebook 声明的 MVC 问题没有任何意义,而且 Facebook 对 Flux 的描述比他们描述的 MVVM 系统更接近 MVC:

    核心问题是他们“做”错了 MVC。然后他们修复了它,但决定重新命名它并说他们发明了解耦数据、视图和事件处理的模式

    YouTube comment

    看起来您的程序员创建了通量,因为他们不知道如何正确使用 MVC 和事件分派器。

    YouTube comment

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 2013-09-19
      • 2015-05-01
      • 2016-12-29
      • 2022-01-22
      • 2020-06-29
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多