js中的MVC

JavaScript010

js中的MVC,第1张

(本文仅供本人记录,并非自主内容产出,如有错误,欢迎纠正!)

MVC定义: MVC是一种架构模式,可以抽象成三个部分:M 模型、V 视图、C 控制器。

一个事件发生的过程(通信单向流动):

js传统开发模式中,大多基于事件驱动:

故js中的MVC 特点 是: 单向流动、事件驱动

一)模型

模型存放着应用的所有数据对象(业务数据、数据校验、增删查改)

数据是 面向对象 的,控制器请求模型读写数据时,模型就将数据包装成模型实例。任何定义在这个数据模型上的函数或逻辑都可以直接被调用。

模型在MVC设计思想中与视图应是解耦的。

二)视图

视图是呈现给用户的,在MVC思想中主要体现的是:视图以 观察者模式 监视模型,以获取最新的数据。故页面首次加载时,是从接收模型的数据开始。

三)控制器

控制器是模型与视图间的桥梁,集中式地配置和管理事件分发、模型分发、视图分发、权限控制和异常处理等。

页面加载完成后,控制器会监听视图的用户交互,一旦发生交互,控制器做出对视图的选择,触发控制器的事件处理机制,去派发新的事件,通知模型更新数据。

优点: 耦合性低、重用性高、生命周期成本低、部署快、可维护性高、有利软件工程化管理

缺点:

没有明确的定义 (MVC模型需要精巧的设计,对中小型项目并不友好,因视图与模型有强制分离的需求,故调试时也比较麻烦)

增加系统结构和实现的复杂性 (过多的更新操作,严格地按照MVC分离反倒会使运行效率降低)

视图与控制器间的过于紧密的连接 (视图需要与控制器配合使用,这就导致了独立重用的难度)

一般高级的界面工具或构造器不支持模式

MVC模式学习之MVC解释:

Model(模型)——View(视图)——Controller(控制器)

1、视图和控制器都依赖于模型;

2、模型相对独立,可以自己的调试和使用

3、在胖客户端程序中,视图和控制器的分离是次要的。

4、在Web程序中可以将视图理解为浏览器,服务器端组件为控制器,模型即为业务逻辑模块

MVC的处理过程:

首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

Angular.js 的wed MVC框架:

目前的前端MVC 框架有很多,如Angular.js,Backbone.js,Javascript MVC,Knockout.js等。虽然都是基于MVC,但是每个框架都有自己处理问题的方法,下面简要分析Angular.js的特点以及适用范围: AngularJS是Google推出的开源的JavaScript MV*(MVW、MVVM、MVC)框架,目前由Google维护。AngularJS弥补了HTML在构建应用方面的不足,其通过使用标识符(directives)结构,来扩展Web应用中的HTML词汇,使开发者可以使用HTML来声明动态内容,从而使得Web开发和测试工作变得更加容易。

使用AngularJS,Model直接与UI视图绑定,Model与UI视图的关系,通过directive封装,AngularJS内置的通用directive,就能实现大部分操作了,也就是说,基本不必关心Model与UI视图的关系,直接操作Model就行了,UI视图自动更新。而Model数据验证、与服务器端的数据交互都是非常简单而自由的。

AngularJS的directive,你输入特定数据,他就能输出相应UI视图,这样的directive可以变成了一个html通用组件,比如文章编辑器组件、分页导航组件、madal组件等,在不同应用中可以直接拿来用,减少重复开发。

用angular.js,写UI视图就是写正常的HTML/CSS,写逻辑控制代码就是用JavaScript操控数据(不是DOM),不同的就是增加了directive,实现DOM与数据的互动,如上所述,directive是通用组件。AngularJS只是定义了一个环境和一个数据与视图交互的机制,并提供了若干通用组件和服务,所以AngularJS开发很简单,很高效,很“原生态”。

Backbone

通过提供模型Models、集合Collection、视图Veiew赋予了Web应用程序分层结构。通过以下方式实现分层结构:

模型Model绑定键值数据和自定义事件;

集合Colection是模型的有序或无序集合,带有丰富的可枚举API;

视图View声明事件监听函数;

将模型、集合、视图与服务端的RESTful

JSON接口连接。

AngularJS

致力于mvc代码解耦,采用model,controller以及view方式去组织代码。

1.数据的双向绑定:这可能是其最激动人心的特性吧,view层的数据和model层的数据是双向绑定的,其中之一发生更改,另一方会随之变化,这不用你写任何代码!(想想jQuery方式下怎么做吧)

2.代码模块化,每个模块的代码独立拥有自己的作用域,model,controller等。

3.强大的directive可以将很多功能封装成HTML的tag,属性或者注释等,这大大美化了HTML的结构,增强了可阅读性;

4.依赖注入,将这种后端语言的设计模式赋予前端代码,这意味着前端的代码可以提高重用性和灵活性,未来的模式可能将大量操作放在客户端,服务端只提供数据来源和其他客户端无法完成的操作;

5.测试驱动开发,angularjs一开始就以此为目标,使用angular开发的应用可以很容易地进行单元测试和端对端测试,这解决了传统的js代码难以测试和维护的缺陷