AngularJS框架中的領(lǐng)域模型

背景

由于最近工作的需要罢荡,后端同學(xué)需要開發(fā)后臺(tái)系統(tǒng)的web界面,所以調(diào)研了一些主流的組件化前端框架对扶,比如reactjs区赵,vuejs,angularjs等浪南。其中angularjs屬于具有完整體系的一個(gè)web框架笼才,也就是說不需要額外的前端庫支持,就可以完成一個(gè)前端應(yīng)用络凿。對(duì)于不是很了解前端技術(shù)棧的后端同學(xué)來說比較適合骡送,同時(shí)與AngularJS整合的Typescript,它的語法也和Java比較接近絮记,而且是強(qiáng)類型的語言摔踱。

Angular框架核心模型

當(dāng)然這篇文章并不是用來談?wù)撉岸丝蚣艿募夹g(shù)選型的,而是想從Angular框架的角度來講講前端開發(fā)領(lǐng)域的模型是什么怨愤?


AngularJS總體架構(gòu)圖

從這個(gè)架構(gòu)圖上我們可以看到里面有很多概念:

  • 模塊(Module)
  • 組件(Components)
  • 模版(Templates)
  • 元數(shù)據(jù)(Metadata)
  • 數(shù)據(jù)綁定(Data binding)
  • 指令(Directives)
  • 服務(wù)(Services)
  • 依賴注入(Dependency injection)

這里很多概念可能后端開發(fā)同學(xué)反而更加熟悉派敷,比如服務(wù)和依賴注入。當(dāng)然我們今天主要是關(guān)注核心模型撰洗,所以我用模型圖把概念里面的模型單拎出來:


AngularJS領(lǐng)域模型

這里我們忽略了元數(shù)據(jù)和依賴注入這兩個(gè)概念膀息,這兩個(gè)我們可以理解成雙向綁定的聲明方式(元數(shù)據(jù)),服務(wù)的調(diào)用方式(依賴注入)所以不放入核心模型中探討了赵。

模塊(Modules)

所謂模塊其實(shí)是語言級(jí)的概念潜支,因?yàn)閖avascript并沒有語言級(jí)的模塊支持,然而幾乎所有的js框架中都有這個(gè)概念柿汛,甚至有很多專門用于實(shí)現(xiàn)js模塊化的框架冗酿。
所以一個(gè)模塊不光可以包含組件(Components)(實(shí)現(xiàn)層面就是一個(gè)用@NgModule聲明的class)埠对,服務(wù)(Services)(實(shí)現(xiàn)層面是一個(gè)普通的class),還可以包含值變量裁替、函數(shù)项玛、類等等。
當(dāng)然Angular的模塊是要依賴語言的包機(jī)制實(shí)現(xiàn)的弱判,一個(gè)典型的Angular模塊:

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

@NgModule({
  imports:      [ BrowserModule ], // 依賴的外部類
  providers:    [ Logger ], // 提供出去的服務(wù)
  declarations: [ AppComponent ], // 屬于這個(gè)模塊的視圖類襟沮,比如components、directives昌腰、pipes
  exports:      [ AppComponent ], // 提供外部訪問的類
  bootstrap:    [ AppComponent ] // 聲明模塊的根組件
})
export class AppModule { }

AngularJS里面沒有applicaiton的概念开伏,所以就用一個(gè)根模塊來表達(dá),如下:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

AngularJS里面也沒有顯示libraries的概念遭商,所以也是用模塊來表達(dá)的固灵。


Angular libraries

組件(Components)

一個(gè)組件主要是控制著屏幕上的一部分視圖,比如整個(gè)應(yīng)用的導(dǎo)航鏈接劫流。

export class HeroListComponent implements OnInit {
  heroes: Hero[];
  selectedHero: Hero;

  constructor(private service: HeroService) { }

  ngOnInit() {
    this.heroes = this.service.getHeroes();
  }

  selectHero(hero: Hero) { this.selectedHero = hero; }
}

在編寫組件的時(shí)候我們需要關(guān)注組件生命周期的擴(kuò)展鉤子:

生命周期的擴(kuò)展鉤子

模版(Templates)

一個(gè)組件的視圖就是一個(gè)模版巫玻,它包含一個(gè)html的框架用來告訴Angular如何渲染組件。

<h2>Hero List</h2>
<p><i>Pick a hero from the list</i></p>
<ul>
  <li *ngFor="let hero of heroes" (click)="selectHero(hero)">
    {{hero.name}}
  </li>
</ul>
<hero-detail *ngIf="selectedHero" [hero]="selectedHero"></hero-detail>

模版可以包含指令祠汇,還可以引用子組件:

組件樹

指令(Directives)

指令是用來告訴Angular框架如何渲染(轉(zhuǎn)化成DOM結(jié)構(gòu))仍秤。一個(gè)指令就是帶有@Directive聲明的一個(gè)類。一個(gè)組件本質(zhì)上也就是一個(gè)關(guān)聯(lián)模版的指令可很。
除了組件型的指令以外诗力,還有結(jié)構(gòu)型的指令,比如下面的模版就包含兩個(gè)框架自帶的結(jié)構(gòu)型的指令:

<li *ngFor="let hero of heroes"></li>
<hero-detail *ngIf="selectedHero"></hero-detail>

其次還有一種屬性型的指令根穷,用于擴(kuò)展html標(biāo)簽的屬性功能,比如提供值綁定能力导坟。

<input [(ngModel)]="hero.name">

當(dāng)然可能還有其他類型的指令屿良,比如處理布局等等,當(dāng)然你也可以自定義新的指令惫周。

服務(wù)(Services)

服務(wù)很大程度上就是一個(gè)普通的類尘惧,但是我們一般會(huì)給它分配一個(gè)明確的職責(zé),讓它提供某一種特定的能力递递。比如:

  • 日志服務(wù)
  • 數(shù)據(jù)服務(wù)
  • 消息總線
  • 稅務(wù)計(jì)算器
  • 應(yīng)用程序配置

日志服務(wù)樣例:

export class Logger {
  log(msg: any)   { console.log(msg); }
  error(msg: any) { console.error(msg); }
  warn(msg: any)  { console.warn(msg); }
}

Angular沒有明確服務(wù)的約束喷橙,但是提供了對(duì)服務(wù)的依賴注入功能:

constructor(private service: HeroService) { }
@Component({
  moduleId: module.id,
  selector:    'hero-list',
  templateUrl: './hero-list.component.html',
  providers:  [ HeroService ]
})

框架就會(huì)做自動(dòng)匹配,效果如下圖:


依賴注入

總結(jié)

我們今天主要從領(lǐng)域模型的角度去了解AngularJS的總體架構(gòu)登舞,核心模型主要有模塊贰逾、組件、模版菠秒、指令疙剑、服務(wù),從中我們可以感覺到從核心模型的角度去理解一個(gè)復(fù)雜系統(tǒng)的設(shè)計(jì)是很有幫助的,往往能很快的抓到系統(tǒng)設(shè)計(jì)的重心言缤。

參考資料

Angular架構(gòu)概述

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚼蚀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子管挟,更是在濱河造成了極大的恐慌轿曙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僻孝,死亡現(xiàn)場離奇詭異导帝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皮璧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門舟扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悴务,你說我怎么就攤上這事睹限。” “怎么了讯檐?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵羡疗,是天一觀的道長。 經(jīng)常有香客問我别洪,道長叨恨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任挖垛,我火速辦了婚禮痒钝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痢毒。我一直安慰自己送矩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布哪替。 她就那樣靜靜地躺著栋荸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凭舶。 梳的紋絲不亂的頭發(fā)上晌块,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音帅霜,去河邊找鬼匆背。 笑死,一個(gè)胖子當(dāng)著我的面吹牛身冀,可吹牛的內(nèi)容都是我干的靠汁。 我是一名探鬼主播蜂大,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼蝶怔!你這毒婦竟也來了奶浦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤踢星,失蹤者是張志新(化名)和其女友劉穎澳叉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沐悦,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡成洗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了藏否。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶殃。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖副签,靈堂內(nèi)的尸體忽然破棺而出遥椿,到底是詐尸還是另有隱情,我是刑警寧澤淆储,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布冠场,位于F島的核電站,受9級(jí)特大地震影響本砰,放射性物質(zhì)發(fā)生泄漏碴裙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一点额、第九天 我趴在偏房一處隱蔽的房頂上張望舔株。 院中可真熱鬧,春花似錦还棱、人聲如沸载慈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃肿。三九已至咕缎,卻和暖如春珠十,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凭豪。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工焙蹭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫂伞。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓孔厉,卻偏偏與公主長得像拯钻,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撰豺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容