注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看。
MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式。
交互方式(所有通信都是单向的):
更详细的说明:
MVC 模式在概念上强调 Model, View, Controller 的分离,各个模块也遵循着由 Controller 来处理消息,Model 掌管数据源,View 负责数据显示的职责分离原则,因此在实现上,MVC 模式的 Framework 通常会将 MVC 三个部分分离实现:
一个通过 JavaScript 所实现的一个基础 MVC 模型,请注意的是:MVC 不是一种技术,仅是一种理念。
/** 模擬 Model, View, Controller */
var M = {}, V = {}, C = {};
/** Model 負責存放資料 */
M.data = "hello world";
/** View 負責將資料輸出到螢幕上 */
V.render = function (M) { alert(M.data); }
/** Controller 作為一個 M 和 V 的橋樑 */
C.handleOnload = function () { V.render(M); }
/** 在網頁讀取的時候呼叫 Controller */
window.onload = C.handleOnLoad;
ASP.NET MVC 中的 MVC 概念,和上面的概念稍微有些不同(有点像下面的 MVP),图示:
被动 MVC(ASP.NET MVC)与主动 MVC(传统 MVC)的区别在于:
资料来源:
Model-View-Presenter (MVP) 是使用者界面设计模式的一种,被广范用于便捷自动化单元测试和在呈现逻辑中改良分离关注点(separation of concerns)。
对 MVC 的改进的思想却是一样的:切断的 View 和 Model 的联系,让 View 只和 Presenter(原 Controller)交互,减少在需求变化中需要维护的对象的数量。
MVP 定义了 Presenter 和 View 之间的接口,让一些可以根据已有的接口协议去各自分别独立开发,以此去解决界面需求变化频繁的问题。
与“被动—MVC 模式(ASP.NET MVC)”很接近,区别在于“视图并不使用模型”。在 MVP 模式中视图和模型是完全分离的,他们通过Presenter进行交互。
Presenter 与控制器非常相似,但是它们也有一些的区别:
MVP 的优势
MVP 的问题
由于对视图的渲染放在了 Presenter 中,所以视图和 Persenter 的交互会过于频繁。还有一点你需要明白,如果 Presenter 过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么 Presenter 也需要变更了。
资料来源:
MVVM(Model-View-ViewModel)的设计模式最早于 2005 年由微软的 WPF 和 Silverlight 架构师 John Gossman 在他的博客中提到。
MVVM 是 MVP 的演化版本,它们唯一的区别是,MVVM 采用双向绑定(data-binding):View 的变动,自动反映在 ViewModel,反之亦然。
MVVM 在使用当中,通常还会利用双向绑定技术,使得 Model 变化时,ViewModel 会自动更新,而 ViewModel 变化时,View 也会自动变化。所以,MVVM 模式有些时候又被称作:model-view-binder 模式。
这个图解准确地描述了什么是 MVVM:一个 MVC 的增强版,我们正式连接了视图和控制器,并将表示逻辑从 Controller 移出放到一个新的对象里,即 View Model。MVVM 听起来很复杂,但它本质上就是一个精心优化的 MVC 架构,
MVVM 模式和 MVC 模式一样,主要目的是分离视图(View)和模型(Model),有几大优点
MVVM 的问题:
资料来源:
Angular.js 是一个 MV*(Model-View-Whatever,不管是 MVC 或者 MVVM,统归 MDV(model Drive View))JavaScript 框架。
Angular.js 是一款开源 JavaScript 库,由 Google 维护,用来协助单一页面应用程序运行的。它的目标是通过 MVC 模式(MVC)功能增强基于浏览器的应用,使开发和测试变得更加容易。
库读取包含附加自定义(标签属性)的 HTML,遵从这些自定义属性中的指令,并将页面中的输入或输出与由 JavaScript 变量表示的模型绑定起来。这些 JavaScript 变量的值可以手工设置,或者从静态或动态 JSON 资源中获取。
Angular.js 六大特性:
Angular.js 简单示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="">
<p>名字 : <input type="text" ng-model="name"></p>
<h1>Hello {{name}}</h1>
</div>
</body>
</html>
资料来源:
Knockout.js 是一个 JavaScript 库(MVVM),它可以让你声明绑定元素和其对应的数据模型,达到你的UI和模型自动双向更新。
Knockout.js 使用 js 代码达到双向绑定的目的,类似 Silverlight/WPF 里的绑定一样,我们主要就是利用相关的特性进行开发的,极大地减少了代码开发量。
Knockout.js 是一个轻量级的 UI 类库,通过应用 MVVM 模式使 JavaScript 前端 UI 简单化。Knockout 是一个以数据模型(data model)为基础的能够帮助你创建富文本,响应显示和编辑用户界面的 JavaScript 类库。任何时候如果你的 UI 需要自动更新(比如:更新依赖于用户的行为或者外部数据源的改变),KO 能够很简单的帮你实现并且很容易维护。
Knockout.js 有如下4大重要概念:
重要特性:
额外的好处:
简单示例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<script type="text/javascript" src="http://knockoutjs.com/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="http://knockoutjs.com/js/jquery.tmpl.js"></script>
<script type="text/javascript" src="http://knockoutjs.com/js/knockout-1.2.1.js"></script>
</head>
<body>
Choose a ticket class:
<select data-bind="options: tickets,
optionsCaption: 'Choose...',
optionsText: 'name',
value: chosenTicket">
</select>
</p>
<p data-bind="template: 'ticketTemplate'">
</p>
<script id="ticketTemplate" type="text/x-jquery-tmpl">
{{if chosenTicket}}
You have chosen <b>${ chosenTicket().name }</b>
($${ chosenTicket().price })
<button data-bind="click: resetTicket">Clear</button>
{{/if}}
</script>
<script type="text/javascript">
var viewModel = {
tickets: [
{ name: "Economy", price: 199.95 },
{ name: "Business", price: 449.22 },
{ name: "First Class", price: 1199.99 }
],
chosenTicket: ko.observable(),
resetTicket: function () { this.chosenTicket(null) }
};
ko.applyBindings(viewModel);
</script>
</body>
</html>
资料来源:
Backbone.js 是一套 JavaScript 框架与 RESTful JSON 的应用程序接口。也是一套大致上符合 MVC 架构的编程范型。Backbone.js 以轻量为特色,只需依赖一套 Javascript 库即可运行。常被用来开发单页的互联网应用程序,以及用来维护网络应用程序的各种部分(例如多用户与服务器端)的同步。
Backbone 最适合的应用场景是单页面应用,并且页面上有大量数据模型,模型之间需要进行复杂的信息沟通。Backbone 在这种场景下,能很好的实现模块间松耦合和事件驱动。 其他适用产品还有微博,网易微博的前端设计也是和 Backbone 类似的一个结构。
Backbone.js 的适用场景非常广,无论是 Web-Page 还是 Web-App 都可以应用,但最合适的还是大型的 Web-App,对于中小型项目来讲 Backbone.js 的 MVC 结构还是有点臃肿了,用不好很容易 over design。Backbone.js 是非常典型的 MVC 框架,但是相对于传统的 server 端 MVC 来讲还是有一些特殊的地方的。
首先 Backbone 中的几大核心组件 View、Model、Collection、Router 中并没有 Controller。其实 v0.5 以前是有 Backbone.Controller 这个东西的,但由于做的根本不是 C 的事情,这个名字又太具有迷惑性了,后来改名叫做 Backbone.Router。而真正的 C 其实是 Backbone.View,但这个 View 其实是部分的 C(还有一部分在 Backbone.Router 中) + 部分的 V,由于前端的模板功能有限,很多应该在 template 中做的事情不得不被拿到 Backbone.View 中来实现。
其次,由于 MVC 的概念中认为 V 其实是永远不知道用户输入(鼠标、键盘事件等)的,C 是输入和 V 之间的连接,但在浏览器中这点其实是实现不了的,V 就是 HTML,而用户输入是基于 HTML 页面的,所以你可以忽略用户输入,把所有事件都导入到 C 去处理,但不代表 V 不知道这件事情。所以前端的 MVC 多少是对传统的 MVC 模型做了些改变的实现,近些日子更多的人转向 MVVM 就是这个原因。
Backbone.js 的优点:
Backbone.js 缺点:
资料来源:
React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
创造 React 是为了解决一个问题:构建随着时间数据不断变化的大规模应用程序。
React 两个主要的思想:
简单:仅仅只要表达出你的应用程序在任一个时间点应该长的样子,然后当底层的数据变了,React 会自动处理所有用户界面的更新。
声明式 (Declarative):数据变化后,React 概念上与点击“刷新”按钮类似,但仅会更新变化的部分。
React 都是关于构建可复用的组件。事实上,通过 React 你唯一要做的事情就是构建组件。得益于其良好的封装性,组件使代码复用、测试和关注分离(separation of concerns)更加简单。
资料来源:
Ember.js 是 JavaScript 框架包中最新的成员之一。 它演变出了最初于 2007 年创建的 SproutCore 项目,Apple 在包括 MobileMe 在内的各种 web 应用程序中大量使用了该项目。 在 emberjs.com,Ember 被形容为 "一个 JavaScript 框架,用于创建可以消除样板并提供标准应用程序架构的大型 web 应用程序。" 它本身紧密集成了名为 Handlebars 的模板引擎,该引擎为 Ember 提供了其中一个最强大的功能: 双向数据绑定。 Ember 还提供了其他功能,比如状态管理(某个用户状态是已注销还是已登录)、自动更新模板(当底层数据发生变化时,您的 UI 也同样发生变化)以及计算属性 (firstName + lastName = fullName)。 Ember 经过一年可靠的开发后,已经成为一个强大的参与者。
Ember 只有一个依赖项—jQuery。 Ember 应用程序的样板 HTML 设置看起来应该与下面的代码类似。 请注意,jQuery 和 Ember 都从 CDN(内容交付网络)进行更新。 如果用户在早些时候访问需要这些文件的其他网站时已经下载过这些文件,这会加快用户的页面加载速度。
与 Ember.js 相比,Angular.js 更像一个研究项目。比如,来看看它们的学习文档:Ember.js 主要讨论模型、视图和控制器,而 Angular.js 指南要求你去学习一些类似于范围、指示符和 transclusion 方面的内容等。
引用示例:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://cloud.github.com/downloads/emberjs/ember.js/ember-0.9.6.min.js"></script>
<script src="js/app.js"></script>
</head>
<body>
</body>
</html>
资料来源:
Avalon.js 是一个功能强大,体积小巧的 MVVM 框架。它遵循“操作数据即操作 DOM”的理念,让你在代码里基本见不到一点 DOM 操作代码。DOM 操作全部在绑定后,交给框架处理。相当后端有了 ORM 一样,不用你手写 SQL,提高生产力!
与其它 js 框架相比,同样实现著名的 todos 功能,在所有 MV* 的实现中 avalon 是让用户写代码最少的。
与其他 MV* 相比,它不仅轻量,最低支持到 IE6,而且性能是最好的。
优势:
与其他框架比较:
资料来源:
附 JavaScript MVC framework