鑒于上篇文章在上周五會議上被問到一些基礎性問題時引發(fā)了一些碰撞搞得我好尷尬帆竹,這篇我盡量寫的完備一些绕娘,但是我不寫示例代碼了,這篇文章最低門檻幾乎和上一篇一樣栽连,是需要小伙伴們知道 JavaScript
是什么险领,/MV*/
這個正則表達式能夠匹配到什么。
背景
最近為開發(fā)新版瑞信通做準備秒紧,看 demo
源碼時注意到 cache.js
中的一段注釋:
// 建議開發(fā)者選擇mvvm框架來通過數(shù)據(jù)來驅(qū)動UI變化
此篇我和小伙伴們分享的就是 MVVM
绢陌,但是介紹 MVVM
之前,完備性起見要從 MVC
和 MVP
開始噩茄。
因為我手頭有 《JavaScript
設計模式》這本書下面,此篇文章也算是我對這本書做筆記了。
MVC
我覺得 MVC
是 well-known
并不會引起小伙伴們質(zhì)疑绩聘,正文從下述 MVP
簡介開始沥割。
MVP
模型-視圖-表示器(MVP
)是 MVC
設計模式的一種衍生模式,專注于改進表示邏輯凿菩。它是在 1990 年代由 Taligent
公司創(chuàng)造的机杜。
Model、View 和 Presenter
MVP
中的 P
代表表示器衅谷。這是一個包含用于 View
(視圖)的用戶界面業(yè)務邏輯的組建椒拗。與 MVC
不同,來自 View
(視圖)的調(diào)用將委托給表示器获黔,表示器是從 View
(視圖)中解耦蚀苛,通過接口與它對話。
最后一句話總結一下 MVP
和 MVC
之間的區(qū)別:
Model View Presenter
設計模式實際上就是許多開發(fā)人員已經(jīng)熟悉的模型視圖控制器的一個最新版本玷氏;兩者的主要區(qū)別是MVP
真正將UI
從應用程序的域/服務層中分離堵未。
MVVM
MVVM
(模型-視圖-視圖模型)是一種基于 MVC
和 MVP
的架構模式,它試圖更清晰地將用戶界面(UI
)開發(fā)從應用程序的業(yè)務邏輯與行為中分離盏触。
Model
:和 MV*
家族的其他成員一樣渗蟹,MVVM
中的 Model
(模型)表示應用程序?qū)褂玫奶囟I域數(shù)據(jù)或信息。
View
:與MVC
一樣赞辩,View
實際上僅是與用戶進行交互的應用程序的一部分雌芽。
ViewModel
:可以將ViewModel
作為一個專門的Controller
,充當數(shù)據(jù)轉(zhuǎn)換器辨嗽。它將Model
信息轉(zhuǎn)變?yōu)?View
信息世落,還將命令從View
傳遞到Model
。
小結:View
和 ViewModel
糟需、ViewModel
和 Model
View
和ViewModel
之間通過數(shù)據(jù)綁定和事件進行通信屉佳。View
處理自己的用戶界面事件来破,必要是將它們映射到ViewModel
。Model
和ViewModel
上的屬性通過雙向數(shù)據(jù)綁定進行同步和更新忘古。
ViewModel
似乎是完全負責MVVM
中的Model
徘禁,但這種關系中有一些微妙之處值得我們注意。ViewModel
可以為了數(shù)據(jù)綁定而暴露Model
或Model
屬性髓堪,也可以包含接口送朱,用于獲取和操作在View
中暴露的屬性。
MVC干旁、MVP 與 MVVM
MVP
和 MVVM
均是 MVC
的衍生品驶沼。MVC
與其衍生品之間的主要區(qū)別是每一層對其他層的依賴,以及它們是如何緊密地互相綁定的争群。
在
MVC
中回怜,View
位于架構之上,與Controller
(控制器)相鄰换薄。Model
位于Controller
(控制器)之下玉雾,因此View
了解Controller
(控制器),Controller
(控制器)了解Model
轻要。在這里复旬,View
能夠直接訪問Model
稀蟋。但是估盘,向View
暴露完整的Model
可能會帶來安全性和性能成本缴淋,這取決與應用程序的復雜性封锉。MVVM
試圖避免這些問題。
在MVP
中吞歼,Controller
(控制器)的作用被Presenter
所替代漠魏。表示器與View
(視圖)位于同一位置邢羔,監(jiān)聽View
和Model
的事件嚼酝,并調(diào)解它們之間的行動浮还。與MVVM
不同,它沒有使用將View
綁定至ViewModel
的機制革半,因此我們轉(zhuǎn)而依賴每個View
來實現(xiàn)用于讓Presenter
與View
進行交互的接口碑定。
因此流码,MVVM
允許我們創(chuàng)建Model
的特定于View
的子集又官,它們可以包含狀態(tài)和邏輯信息,無需向View
暴露整個Model
漫试。與MVP
的Presenter
不同六敬,引用View
時不需要ViewModel
。View
可以綁定到ViewModel
上的屬性驾荣,而屬性會將Model
所包含的數(shù)據(jù)暴露給View
外构。如前所述普泡,View
的抽象意味著它背后的代碼所要求的邏輯更少了。