ChatGPT解决这个技术问题 Extra ChatGPT

Angular 设计模式:MVC、MVVM 还是 MV*?

Angular 1.x (AngularJS) 或多或少遵循 MV* 设计原则,因为它具有双向数据绑定功能。

Angular2 采用了基于组件的 UI,React 开发人员可能熟悉这个概念。从某种意义上说,Angular 1.x 控制器和指令模糊了新的 Angular 2 组件。

这意味着在 Angular 2 中没有控制器和指令。取而代之的是,一个组件有一个选择器,它对应于该组件将表示的 html 标记和一个 @View 来指定要填充的组件的 HTML 模板。

Angular2 仍然实现双向数据绑定,但不包含模型,例如,如果我有一个显示文章列表的 @Component 和一个定义文章对象的 class

class Article {
title: string;
link: string;
votes: number;

constructor(title: string, link: string, votes?: number){
    this.title = title;
    this.link = link;
    this.votes = votes || 0;
}

这在 MVC 模式中将被视为模型。

那么考虑到这一点,Angular 最接近哪种设计模式?


B
Belfield

Angular 2 并不是真正的 MVC(但我想你可以画出相似之处)。它是基于组件的。让我解释:

Angular 1 是 MVC 和 MVVM (MV*)。 Angular 1 具有开创性的原因有几个,但主要原因之一是它使用了依赖注入。与 Backbone 和 Knockout 等其他 JS 框架相比,这是一个新概念。

然后 React 出来了,彻底改变了前端架构。它让前端更多地考虑除了 MVC 和 MVVM 之外的其他选项。相反,它创造了基于组件的架构的想法。这可以说是自 HTML & JavaScript 以来前端架构最重大的变革之一。

Angular 2(和 Angular 1.5.x)决定采用 React 的方法并使用基于组件的架构。但是,您可以在 MVC、MVVM 和 Angular 2 之间画出些许相似之处,这就是为什么我认为它可能有点令人困惑。

话虽如此,Angular 2 中没有控制器或视图模型(除非你手工制作它们)。相反,有组件,它们由模板(如视图)、类和元数据(装饰器)组成。

例如,模型是保存数据的类(例如,保存由 http 服务使用 @angular/http 返回的数据的数据协定)。我们可以创建一个添加方法和属性(逻辑)的新类,然后合并模型和类。这会创建类似于 ViewModel 的东西。然后我们可以在我们的组件中使用这个 ViewModel。

但是将组件的类或服务称为 ViewModel 或 Controller 是不正确的。组件包含模板和类。 IMO 这有点像 Liskov 的理论 - 鸭子不是鸭子 - 不要试图将 MVC 或 MVVM 模式强制转换为组件,因为它们是不同的。将 Angular 2 视为组件。但我可以理解为什么人们会通过类比来帮助他们初步理解。

Angular 还使用模块,这是即将推出的 JavaScript 版本(ECMAScript 6)的一部分。这非常强大,因为 JavaScript 在命名空间和代码组织方面一直存在问题。这是进口和出口进入组件的地方。

有用的链接:

https://medium.com/javascript-scene/angular-2-vs-react-the-ultimate-dance-off-60e7dfbc379c

Is angular2 mvc?


我不确定是否有必要假设组件层次结构和单个组件结构是专有的,并且它们不在 Ext JS 之类的框架中。即使 Angular 不是 MVVM,将视图绑定组件类属性视为视图模型对我来说也是有用的,以便将实现实现为状态随时间的变化,而不是 DOM 的方法或过程操作。与其他 MVVM 框架一样,这有助于减少意大利面条式代码和一般复杂性。
s
siva636

Angular 1 和 Angular 2 都遵循 MVC(模型、视图、控制器)模式。

在 Angular 1 中,HTML 标记是视图,控制器是控制器,而服务(当它用于检索数据时)是模型。

在 Angular 2 中,模板是视图,类是控制器,服务(用于检索数据时)是模型。

因为 Angular 是一个客户端框架,所以 Angular 遵循的 MVC 模式可以称为 MVVC(模型、视图、视图控制器)。


可以解释一下为什么MVVC?谢谢你。
服务不是模型。模型就是模型。通常在 MVC 相关框架中,您实际上有两种类型的模型 (1) 域模型 (2) 使域模型适应视图的模型(有时称为 ViewModel)。
@gusgorman Service 是 Angular 2+ 中的模型,因为它检索数据,该模型应该在 MVC 架构中执行。
service 不是一个模型,service 只是一个可注入的逻辑,它可能会或可能不会检索数据。
无效的答案:(
P
Picci

我不太热衷于使用 M** 表示法(有点滥用和模糊)。无论如何,在我看来,最简单和最有效的方法是在 Angular2 中:

类(在你的情况下是文章)代表模型

组件合并视图(在模板中)和控制器(打字稿逻辑)

我希望它有帮助


A
Ashish Kamble

使用 AngularJS 的 MVC 和 MVVM

MVC 设计模式

首先,MVC 设计模式并非特定于 AngularJS,您一定已经在许多其他编程语言中看到/实现过这种模式。

MVC 设计模式可以在 AngularJS 中看到,但在进入之前,让我们看看 MVC 设计模式包括哪些内容:

模型:模型不过是数据。视图:视图表示此数据。控制器:控制器介于两者之间。

在 MVC 中,如果我们对视图进行任何更改,它不会在模型中更新。但是在 AngularJS 中,我们听说有一种叫做 2-way binding 的东西,这种 2-way 绑定支持 MVVM 设计模式。

MVVM 基本上包括 3 样东西:

Model View View Model Controller 实际上是在 MMVM 设计模式中被 View Model 代替。 View Model 只不过是一个 JavaScript 函数,它又像一个控制器,负责维护视图和模型之间的关系,但这里的区别是,如果我们更新视图中的任何内容,它会在模型中更新,更改模型中的任何内容,它出现在视图中,这就是我们所说的 2-way binding。

这就是为什么我们说 AngularJS 遵循 MVVM 设计模式。


错误:“模型只不过是数据。”其实就是数据、元数据、业务逻辑、数据库接口。错误:“控制器在两者之间进行调解。”事实上,控制器并没有做这样的事情。视图对模型中的更改事件做出反应,而控制器没有提示。控制器的任务从用户事件开始,您甚至都没有提及。
“视图模型只不过是一个再次像控制器一样的 JavaScript 函数”状态是错误的
@GuidoMocha 请编辑和更新答案,我喜欢批准它。
I
Ignacio Soler Garcia

在我看来,如果你想使用一些约定,你可以使用 MVVM 在 Angular 2 中开发:

组件包含视图(模板)和视图模型(类)。您只会错过模型,您可以将其创建为普通的 TypeScript 类并将其作为构造函数参数传递给视图模型。

该技术与 PRISM 和 WPF 中可用的技术非常相似,您可以使用 MVVM 开发所有内容(如果您愿意的话)。


J
Jai Narayan

在 Angular(不包括版本 2 及更高版本)中,我们使用数据绑定功能。此数据绑定功能在 ng 应用程序中强制执行 MVVM 模式,因为在这种情况下,控制器会导致 V&M 之间的绑定(视图更改会导致模型更改,反之亦然)因此在 MVC 术语中,我们可以将 'C' 替换为 'VM' 给出'MVVM'