Ember.js MVC
Ember.js 框架使用模型-視圖-控制器(MVC)模式的應(yīng)用架構(gòu)。許多其它框架和平臺(tái)也 使用這個(gè)模式,所以你可能會(huì)聽(tīng)說(shuō)過(guò)。雖然這些概念一直是跨平臺(tái)的,但實(shí)現(xiàn)可能會(huì)有 相當(dāng)大的差異。因此,理解 Ember.js 的 MVC 實(shí)現(xiàn)與你熟悉的 MVC 實(shí)現(xiàn)有何不同是很 重要的。
MVC 基礎(chǔ)
MVC 模式的目的是分離出關(guān)鍵問(wèn)題,這樣,對(duì)象的測(cè)試、維護(hù)和重用會(huì)更容易。
模型 是存放最多應(yīng)用數(shù)據(jù)的地方。模型通常是預(yù)先指定的,用模式或其它類型的模 板來(lái)形式化和優(yōu)化數(shù)據(jù)存儲(chǔ)和檢索。它通常被實(shí)現(xiàn)為一個(gè)數(shù)據(jù)類型、類或是數(shù)據(jù)庫(kù)表的 形式。一個(gè)木星的例子可以是一個(gè) User
,它由 username
和 password
兩個(gè)字 符串字段構(gòu)成??梢詣?chuàng)建并存儲(chǔ)許多 User
對(duì)象,并且它們通常不負(fù)責(zé)任何應(yīng)用邏輯 。
視圖 描述各種各樣應(yīng)用組件(通常是 模型 的一部分)的表現(xiàn)。視圖是用戶能看 得見(jiàn)并與應(yīng)用交互的部分。它們可以服從給定系統(tǒng)中任何可行的樣式化,并且不保持永 久的狀態(tài)。有許多標(biāo)記語(yǔ)言(比如 HTML/CSS)和模板語(yǔ)言(比如 Handlebars)可用于 編寫(xiě)視圖。視圖的一個(gè)例子可以是一個(gè)用戶編輯頁(yè)面的模板,它包含處理創(chuàng)建并樣式化 標(biāo)簽和編輯用字段的代碼。
控制器 承擔(dān)連接起 模型 和 視圖 的任務(wù)。它提供應(yīng)用的業(yè)務(wù)邏輯,從視圖中 接受輸入并在模型上執(zhí)行 CRUD 操作。一個(gè)控制器會(huì)從視圖對(duì)象中提取用戶名和密碼, 并與模型對(duì)象比較它們,用下一個(gè)顯示登入狀態(tài)的視圖(也可能是別的什么)替換當(dāng)前 的視圖。
Ember.js 實(shí)現(xiàn)
Ember 提供了多種對(duì)象來(lái)奠定輕松實(shí)現(xiàn) MVC 功能的基礎(chǔ)。例如:
DS.Model
允許你描述你的應(yīng)用的數(shù)據(jù)結(jié)構(gòu),包括模型之間的關(guān)系。Ember.View
封裝 HTML 模板,讓你寫(xiě)出可重用、易于維護(hù)的應(yīng)用視圖。Ember.ArrayController
使得管理對(duì)象列表易如反掌,提供了在內(nèi)容中迭代的便利方法。- Ember.js 也添加了一種重要的新架構(gòu):一個(gè)可以在視圖、控制器和數(shù)據(jù)存儲(chǔ)間調(diào)停 的狀態(tài)管理器。它可以作為你的應(yīng)用的映射,并把轉(zhuǎn)換處理為一個(gè)用戶經(jīng)過(guò)它。
所有這些對(duì)象都繼承自 Ember.Object
,它提供了諸如綁定支持、觀察者、計(jì)算屬性 和繼承這樣的絕妙特性。
與 Ruby on Rails 的區(qū)別
一個(gè)很普遍的誤解就是 Ember.js 的 MVC 實(shí)現(xiàn)一定與 Ruby on Rails 的相似。這是不 正確的。
這個(gè)區(qū)別的原因就是 Ruby on Rails 是一個(gè)服務(wù)端框架,而 Ember 是一個(gè)客戶端框架 。[1]
Ember 在瀏覽器中運(yùn)行,所以它可以檢測(cè)并相應(yīng)瀏覽器事件,諸如鼠標(biāo)點(diǎn)擊、手指點(diǎn) 擊、滾動(dòng)、按鍵等等。接收這些事件的視圖對(duì)象可以把它們呈遞給控制器對(duì)象,而控制 器對(duì)象可以作用于數(shù)據(jù)模型來(lái)保存變更??蛻舳税l(fā)生的一切都在瀏覽器中,并且 ember-data 關(guān)注發(fā)送或接受去往或來(lái)自服務(wù)器 API 的合適數(shù)據(jù)。
另一方面,Rails 運(yùn)行在服務(wù)器上。照此,它只能通過(guò) HTTP 請(qǐng)求與客戶端通信。服務(wù) 器接受 HTTP 請(qǐng)求作為輸入(GET /、POST /user/1 等等),讀取路由并把它映射到控 制器行為,而不是直接從用戶接收事件。控制器之后會(huì)用模型和視圖模板來(lái)構(gòu)造一個(gè)響 應(yīng)(通常是一個(gè) HTML 文檔形式的)來(lái)用 HTTP 返回。用戶總是與一個(gè)基本上扁平,基于用戶請(qǐng)求的要求組合的頁(yè)面交互。
在構(gòu)建你的應(yīng)用程序架構(gòu)時(shí),牢記這些差異是很重要的。
[1] 雖然在服務(wù)器端運(yùn)行 Ember.js 是可行的,但這超出了本指導(dǎo)的范 疇。
原文鏈接:http://emberjs.torriacg.org/guides/ember_mvc/#toc_ember-js