《用AngularJS開(kāi)發(fā)下一代Web應(yīng)用》讀書筆記①:AngularJS簡(jiǎn)介

IMG_20161118_181453_HDR.jpg

開(kāi)篇是技術(shù)框架慣例的吹牛逼時(shí)間,建議略過(guò)

  • 在創(chuàng)建優(yōu)質(zhì)的web應(yīng)用方面未桥,Angular團(tuán)隊(duì)致力于減輕開(kāi)發(fā)人員在開(kāi)發(fā)Ajax應(yīng)用過(guò)程中的痛苦冬耿。
  • 編寫web應(yīng)用的過(guò)程中萌壳,我們希望使用這樣的一個(gè)前端框架來(lái)構(gòu)建:使用簡(jiǎn)單,易于理解缤骨,同時(shí)當(dāng)web應(yīng)用變得復(fù)雜時(shí)绊起,依然能易于測(cè)試燎斩、擴(kuò)展和維護(hù)。更希望能一邊編寫代碼笋鄙,一邊看到代碼的效果怪瓶,而不是為了滿足瀏覽器內(nèi)部的奇怪運(yùn)行機(jī)制劳殖,頻繁修改(兼容性)。
  • AngularJS框架已經(jīng)實(shí)現(xiàn)以上的目標(biāo)宣增,這得益于Angular周邊的開(kāi)源社區(qū)爹脾,讀者可以在GitHub上獲取更多大型的、復(fù)雜的案例灵妨。 ( AngularJS GitHub頁(yè)面

介紹一些AngularJS框架中涉及到的概念

客戶端模板

  • 類似Rails泌霍、PHP和JSP等傳統(tǒng)的web應(yīng)用(多頁(yè)面應(yīng)用)是將構(gòu)建好的HTML頁(yè)面整個(gè)返回給瀏覽器。而Ajax應(yīng)用(單頁(yè)面應(yīng)用)是只向服務(wù)器請(qǐng)求數(shù)據(jù)蟹地,在瀏覽器端把HTML模板與字符串組合起來(lái)怪与,最后把結(jié)果插入DOM中缅疟,實(shí)現(xiàn)DOM的局部?jī)?nèi)容刷新存淫。
  • AngularJS是在Ajax的基礎(chǔ)上進(jìn)行了封裝和簡(jiǎn)化(使得頁(yè)面模板的定義可以直接在HTML中進(jìn)行,不需要在Java或JavaScript中編寫HTML代碼)
<!DOCTYPE html>
<!-- 1.通過(guò)ng-app設(shè)置Angular管理的范圍 -->
<html ng-app="myApp">
    <head>
        <meta charset="UTF-8">
        <title>AngularJS Hello World</title>
    </head>
    <!-- 2.引入Angular的文件 -->
    <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"/>
    <body>
        <!-- 3.通過(guò)ng-controller定義控制器 -->
        <div ng-controller="HelloController">
            <!-- 4.嵌套花括號(hào)的方式執(zhí)行angular表達(dá)式 --> 
            <h3 class="show">{{text}},World</h3>
        </div>
    </body>
    <!-- 5.編寫控制器的實(shí)現(xiàn)細(xì)節(jié) -->
    <script type="text/javascript">
        var app = angular.module('myApp', []);
        app.controller('HelloController', function($scope) {
            $scope.text = "Hello";  //初始值
        });
    </script>
</html>

Model View Controller(MVC)

  • MVC背后的核心理念是:把管理數(shù)據(jù)的代碼(model)、應(yīng)用邏輯代碼(controller)轧邪,以及向用戶展示數(shù)據(jù)的代碼(view)清晰的分離開(kāi)來(lái)忌愚。
  • 理想的代碼流程是:
    • 視圖從模型中獲取數(shù)據(jù),展示給用戶院水;
    • 當(dāng)用戶進(jìn)行界面交互時(shí)檬某,控制器會(huì)做出響應(yīng)并修改模型中的數(shù)據(jù)螟蝙;
    • 最后,模型會(huì)通知視圖场斑,數(shù)據(jù)已經(jīng)發(fā)生了變更漏隐,視圖再刷新顯示的內(nèi)容;
  • 在angular應(yīng)用中挺据,視圖就是DOM爽柒,控制器是自定義的JavaScript函數(shù)浩村,而模型數(shù)據(jù)則被存儲(chǔ)在$scope對(duì)象中心墅。
  • 通過(guò)MVC來(lái)組織代碼怎燥,會(huì)讓你的web應(yīng)用更加易于擴(kuò)展蜜暑、維護(hù)和測(cè)試肛捍。更重要的拙毫,MVC是一個(gè)思想上的模型缀蹄,編寫MVC標(biāo)準(zhǔn)的代碼缺前,能讓其他開(kāi)發(fā)者一眼看懂所寫的代碼,減少溝通成本滞欠。

數(shù)據(jù)綁定

  • 上面提到過(guò)Ajax應(yīng)用通過(guò)hisinnerHTML的方式將更新的HTML字符串插入到DOM筛璧,實(shí)現(xiàn)局部刷新。但如果需要頻繁更新數(shù)據(jù)棺牧,或者根據(jù)用戶輸入來(lái)修改數(shù)據(jù)的時(shí)候朗儒,則需要做很多及其繁雜的工作來(lái)保證數(shù)據(jù)的狀態(tài)是正確的颊乘,并且UI和JavaScript屬性要同時(shí)正確醉锄。
  • AngularJS通過(guò)數(shù)據(jù)綁定乏悄,讓數(shù)據(jù)自己去同步。并且這一機(jī)制恳不,對(duì)來(lái)自服務(wù)器的數(shù)據(jù)檩小,同樣有效。
<!DOCTYPE html>
<!-- 1.通過(guò)ng-app設(shè)置Angular管理的范圍 -->
<html ng-app="myApp">
    <head>
        <meta charset="UTF-8">
        <title>AngularJS Hello World</title>
    </head>
    <!-- 2.引入Angular的文件 -->
    <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <body>
        <!-- 3.通過(guò)ng-controller定義控制器 -->
        <div ng-controller="HelloController">
            <!-- 4.ng-model進(jìn)行數(shù)據(jù)模型綁定 -->
            <input ng-model='text' />
            <!-- 5.嵌嵌套花括號(hào)的方式執(zhí)行angular表達(dá)式 -->    
            <h3 class="show">{{text}},World</h3>
        </div>
    </body>
    <!-- 5.編寫控制器的實(shí)現(xiàn)細(xì)節(jié) -->
    <script type="text/javascript">
        var app = angular.module('myApp', []);
        app.controller('HelloController', function($scope) {
            $scope.text = "";   //初始值
        });
    </script>
</html>

效果:


數(shù)據(jù)綁定案例

依賴注入

  • 上面通過(guò)$scope對(duì)象獲取數(shù)據(jù)烟勋,但我們并不需要調(diào)用函數(shù)去創(chuàng)建這個(gè)對(duì)象。除了$scope對(duì)象之外阻肿,Angular還提供了很多對(duì)象來(lái)做一些很酷的事情,比如通過(guò)$location訪問(wèn)原生的window對(duì)象沮尿。這些都是通過(guò)Angular的依賴注入機(jī)制實(shí)現(xiàn)的。
  • 依賴注入機(jī)制遵循迪米特法則的設(shè)計(jì)模式畜疾,我們的類知識(shí)簡(jiǎn)單的獲取它們所需要的東西赴邻,而不需要?jiǎng)?chuàng)建那些它們所依賴的東西庸疾。

迪米特法則乍楚,也叫做最少知識(shí)原則届慈,核心含義是一個(gè)類要盡量少地知道其他類的相關(guān)信息徒溪。

指令

  • Angualr最強(qiáng)大的功能之一就是可以把模板寫成HTML的形式金顿,這是由于內(nèi)置的DOM轉(zhuǎn)換引擎臊泌,通過(guò)該引擎擴(kuò)展HTML的語(yǔ)法揍拆。
  • 例如渠概,通過(guò)花括號(hào){{text}}進(jìn)行雙向數(shù)據(jù)綁定,通過(guò)ng-controller用來(lái)指定控制器播揪,通過(guò)ng-model將輸入數(shù)據(jù)綁定到模型中的屬性贮喧,這些都是HTML擴(kuò)展指令猪狈。
  • 不僅限于Angular內(nèi)置的指令箱沦,甚至還可以編寫自定義的指令來(lái)擴(kuò)展HTML模板的功能雇庙。

入門實(shí)例:購(gòu)物車

<!DOCTYPE html>
<!-- 通過(guò)ng-app設(shè)置Angular管理的范圍 -->
<html ng-app="myApp">
    <head>
        <meta charset="UTF-8">
        <title>AngularJS Shopping Cart</title>
    </head>
    <style type="text/css">
        span{border: 1px solid #CCCCCC;}
        .bookItem{margin-bottom: 15px;}
        .bookName{font-weight: bold;}
        .bookPrice{width: 28px;text-align: center;}
    </style>
    <!-- 引入Angular的文件 -->
    <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <body ng-controller='CartController'>
        <h2>你的購(gòu)物車</h2>
        <!-- 通過(guò)ng-repeat遍歷數(shù)據(jù)模型,并復(fù)制DOM結(jié)構(gòu) -->
        <div ng-repeat='item in items' class="bookItem">
            <!-- 獲取數(shù)據(jù)模型中的屬性值放入DOM結(jié)構(gòu) -->
            <div class="bookName">{{item.title}}</div>
            <!-- ng-model把數(shù)據(jù)模型和輸入框綁定關(guān)系 -->
            <input ng-model='item.quantity' class="bookPrice"/>
            <span>單價(jià):{{item.price}}元</span>
            <span>總價(jià):{{item.price * item.quantity}}元</span>
            <button ng-click="remove($index)">移除</button>
        </div>
    </body>
    <!-- 在自定義控制器中實(shí)現(xiàn)業(yè)務(wù)細(xì)節(jié) -->
    <script type="text/javascript">
        var app = angular.module('myApp', []);
        app.controller('CartController', function($scope) {
            //虛擬數(shù)據(jù)
            $scope.items = [
                {
                    title : 'JavaScript性能優(yōu)化:度量疆前、監(jiān)控與可視化',
                    quantity : 1,
                    price : 40.40
                },
                {
                    title : 'HTML5基礎(chǔ)知識(shí) 核心技術(shù)與前沿案例',
                    quantity : 2,
                    price : 59.30
                },
                {
                    title : 'ES6標(biāo)準(zhǔn)入門',
                    quantity : 1,
                    price : 58.70
                }
            ];
            //移除方法
            $scope.remove = function(index){
                $scope.items.splice(index,1);
            };
        });
    </script>
</html>

效果:


Angular購(gòu)物車案例
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竹椒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碾牌,老刑警劉巖康愤,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舶吗,死亡現(xiàn)場(chǎng)離奇詭異择膝,居然都是意外死亡誓琼,警方通過(guò)查閱死者的電腦和手機(jī)肴捉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門腹侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人齿穗,你說(shuō)我怎么就攤上這事傲隶∏砸常” “怎么了跺株?”我有些...
    開(kāi)封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脖卖,是天一觀的道長(zhǎng)乒省。 經(jīng)常有香客問(wèn)我,道長(zhǎng)畦木,這世上最難降的妖魔是什么袖扛? 我笑而不...
    開(kāi)封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮十籍,結(jié)果婚禮上蛆封,老公的妹妹穿的比我還像新娘。我一直安慰自己惨篱,他們只是感情好垒迂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布妒蛇。 她就那樣靜靜地躺著,像睡著了一般绣夺。 火紅的嫁衣襯著肌膚如雪吏奸。 梳的紋絲不亂的頭發(fā)上陶耍,一...
    開(kāi)封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音烈钞,去河邊找鬼泊碑。 笑死毯欣,一個(gè)胖子當(dāng)著我的面吹牛馒过,可吹牛的內(nèi)容都是我干的酗钞。 我是一名探鬼主播腹忽,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砚作,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窘奏!你這毒婦竟也來(lái)了葫录?” 一聲冷哼從身側(cè)響起着裹,我...
    開(kāi)封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤米同,失蹤者是張志新(化名)和其女友劉穎骇扇,沒(méi)想到半個(gè)月后窍霞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匠题,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡但金,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钱磅。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盖淡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褪迟,我是刑警寧澤冗恨,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布味赃,位于F島的核電站掀抹,受9級(jí)特大地震影響心俗,放射性物質(zhì)發(fā)生泄漏傲武。R本人自食惡果不足惜城榛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一揪利、第九天 我趴在偏房一處隱蔽的房頂上張望狠持。 院中可真熱鬧疟位,春花似錦工坊、人聲如沸献汗。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)楚午。三九已至,卻和暖如春矾柜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怪蔑。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工里覆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缆瓣,地道東北人喧枷。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像隧甚,于是被迫代替她去往敵國(guó)和親车荔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戚扳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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