角度设计模式:MVC,MVVM或MV *?

问题描述 投票:62回答:6

[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

angular model-view-controller design-patterns mvvm mv
6个回答
64
投票

Angular 2并不是真正的MVC(但是我想您可以绘制平行线)。它是基于组件的。让我解释一下:

角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中没有控制器或ViewModel(除非您手工制作它们)。而是有一些组件,它们由一个模板(如视图),类和元数据(装饰器)组成。

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

但是将组件的类或服务称为ViewModel或Controller并不是真正正确的。组件包含模板和类。 IMO有点像Liskov的理论-鸭子不是鸭子-不要试图将MVC或MVVM模式强加到不同的组件中。将Angular 2视为组件。但是我明白了为什么人们会提起相似之处以帮助他们初步理解。

Angular还使用Modules,它是即将发布的JavaScript(ECMAScript 6)版本的一部分。这非常强大,因为JavaScript始终在命名空间和代码组织方面遇到问题。这是组件导入和导出的地方。

有用的链接:

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

Is angular2 mvc?


23
投票

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

在Angular 1中,HTML标记是View,Controller是Controller,而Service(当它用于检索数据时)是模型。

在Angular 2中,模板是View,类是Controller,服务是模型(当用于检索数据时)。

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


13
投票

我不太喜欢使用M **表示法(有点受虐和迷雾)。无论如何,我认为最简单,最有效的表达方式是在Angular2中:

该类(您所用的文章为代表的模型)

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

希望对您有帮助


5
投票

带有AngularJS的MVC和MVVM

MVC设计模式

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

可以在AngularJS中看到MVC设计模式,但在深入了解之前,我们先来看一下MVC设计模式包括哪些内容:

模型:模型不过是数据。视图:视图代表此数据。控制器:控制器在两者之​​间进行调解。

在MVC中,如果我们在视图中进行了任何更改,则不会在模型中进行更新。但是在AngularJS中,我们听说有一种叫做2向绑定的东西,而这种2向绑定使MVVM设计模式成为可能。

MVVM基本上包括三件事:

型号视图查看模型在MMVM设计模式中,控制器实际上已由视图模型代替。视图模型不过是一个JavaScript函数,它又像一个控制器,并负责维护视图和模型之间的关系,但是这里的区别是,如果我们更新视图中的任何内容,它将在模型中进行更新,而在模型中进行任何更改,显示在视图中,这就是我们所说的2向绑定。

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


4
投票

据我拙见,如果要使用某些约定,可以使用MVVM在Angular 2中进行开发:

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

该技术与PRISM和WPF中可用的技术非常相似,在那里您可以使用MVVM开发所有内容(如果需要)。


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.