MVC 与 Flux ? 双向与单向?
Real and Pure MVC 是单向的。从粘贴在问题中的维基百科图表中可以清楚地看出。
十多年前,当像 Apache Struts 这样的服务器端框架实现一种称为模型视图展示器 (MVP) 模式的 MVC 变体时,它们使每个请求都通过控制器,每个响应都通过控制器返回。每个人都继续称其为 MVC。由于网络的固有特性,模型中的任何更改都无法在没有视图发送请求或更新的情况下传播到视图。所以没有实现纯MVC。而是实施了MVP。
几年前,当 Angular、Ember、Knockout 等框架在前端实现 MVC 时,他们实现了 MVC 的另一种变体,称为模型视图视图模型 (MVVM) 模式,很少有人继续称其为 MVC。(很少有人意识到术语并不重要,并称其为 MVW(W 代表“随便”)),他们都没有实现纯 MVC。
React 诞生时,他们趁机实现了纯 MVC(不是 MVP 或 MVVM),并在几乎没有改动的情况下将其重命名为 Flux。我觉得 Flux 是 MVC 的另一种变体。尽管 Flux/React 团队说它不是 MVC,但我看到这两种架构 - Flux 和 MVC 之间有很多相同之处。
因为在 Javascript 框架中,MVC 不像你描述的那样工作。UI 通常与模型双向通信,如下所示:
- 用户输入查看输入
- MVC 框架绑定 onchange() 来更新模型。
- Ajax 请求引入了新的模型数据。
- MVC 框架更新视图输入的值以匹配模型。
在 Flux 架构中,UI 只会将具有类型和关联数据的独立操作触发到调度程序,然后调度程序将更新模型,就像任何后台 ajax 方法更新模型一样。
参考:http : //www.thesoftwaresimpleton.com/blog/2013/03/23/client-side-mvc/
“客户端 MVC 与服务器端 MVC 完全不同”
“我们正在两个对象之间建立双向通信……”
“简而言之,我们将 Person 对象的 firstName 属性的值与输入的 value 属性连接在一起。”
http://guides.emberjs.com/v1.10.0/object-model/bindings/
Ember.js 中的绑定可以用于任何对象,而不仅仅是在视图和模型之间。
我是一名嵌入式开发人员,我在我的应用程序中使用 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 | |
| | | | | | |
|------| |------------| |-------| |
| | | |
| |--------------------<<<<-------------------| |
|----------------------<<<<----------------------------|
有些人采用术语 MVC 来指代 JavaScript 框架,其他人指出这些框架不是纯粹的 MVC,而是一种变体,可以称为MVP(主干)、MVVM(Angular 1)或更广泛的 MV*(另请参阅Arun 的回答))。
当Facebook 引入 Flux 时,他们将其与 MVVM/MVP/MV* 的问题进行了比较,但混淆地使用了术语 MVC。
对于观看此视频的纯 MVC 开发人员来说,Facebook 声明的 MVC 问题没有意义,Facebook 对 Flux 的描述比他们描述的 MVVM 系统更接近 MVC:
核心问题是他们“做”MVC 是错误的。然后他们修复了它,但决定重新命名并说他们发明了解耦数据、视图和事件处理的模式
看起来您的程序员创建了通量,因为他们不知道如何正确使用 MVC 和事件调度程序。