Angular 學習筆記(一)

什麼是 Angular:html

    Angular 是一個 JavaScript 框架,可經過 <script> 標籤添加到 HTML 頁面,而後經過指令擴展 HTML,且經過表達式綁定數據到 HTML 中前端

    Angular 是爲了擴展 HTML 在構建應用時本應具有的能力而設計的。對於靜態文檔,HTML 是一門很好的聲明式的語言,express

    但對於構建動態 WEB 應用,它無能爲力。因此,構建動態WEB應用每每須要一些技巧才能讓瀏覽器配合咱們的工做瀏覽器

注:粗淺地理解指令就是一些附加在 HTML 元素上的自定義標記(例如:ng-controller、ng-repeat 等這些原生的 HTML 所沒法識別的語句),app

       表達式是一種相似 JavaScript 的代碼片斷,一般在視圖中以''的形式使用框架

 

Angular 與其餘一些模板比較:ide

    One-Way Data Binding:絕大多數模板引擎系統採用的是把字符串模板和數據拼接,而後輸出一個新的字符串函數

                                            接着在前端將這個新的字符串做爲元素的 innerHTML 屬性的值spa

    ==》數據中的改變需從新和模板合併,而後再賦值給 DOM 元素的 innerHTML 屬性設計

 

    Two-Way Data Binding:Angular 編譯器直接使用 DOM 爲模板,它的視圖和做用域數據模型的綁定是透明

    ==》生成了穩定的 DOM 模板

注:DOM 元素實例和數據模型實例的綁定在綁按期間是不發生變化的,這意味着能夠在代碼中獲取這些 DOM 模板元素並註冊相應的

       事件處理函數,而不用擔憂這個對 DOM 元素的引用會由於數據合併而產生變化

 

HTML 編譯的三個階段:

    一、$compile 遍歷 DOM 節點,匹配指令:

    發現某元素匹配一個指令,那麼指令就被添加到指令列表中(該列表與 DOM 元素對應),一個元素可能匹配到多個指令

注:當一個頁面加載時,瀏覽器自動將 HTML 解析爲 DOM 樹!Angular 的編譯是在 DOM 節點上發生而非字符串,當手動調用 $compile 時,

       若給它傳遞一個字符串則會報錯,需用 angular.element 將字符串轉化爲 DOM

    二、當全部指令都匹配到相應的元素時,編譯器按指令的 priority 屬性來排列指令編譯順序:

    根據順序依次執行每一個指令的 compile 函數,每一個 compile 函數有一次更改該指令所對應的 DOM 模板的機會,接着,每一個 compile 函數

    返回一個 link 函數,這些函數又構成一個「合併的」鏈接函數,它會調用每一個指令返回的 link 函數

    三、$compile 調用第 2 步返回的鏈接函數,將模板和對應的做用域鏈接:

    依次調用鏈接函數中包含的每一個指令對應的 link 函數,進而在各個 DOM 元素上註冊監聽器以及在相應的 scope(做用域)中設置 $watch

 

==》造成一個做用域和 DOM 綁定的實時視圖,任一發生在已通過編譯的做用域上的數據模型的變化都反映在 DOM 中

 

注:priority 設置指令的優先級,大的先執行(默認爲 0,而 ng-repeat 默認爲 1000),$watch 實現頁面隨 model(模型)變化而及時更新

  DOM 即  Document Object Model(文檔對象模型)

 

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<!--設置應用名稱爲 myApp,控制器爲 myCtrl-->
<div ng-app="myApp" ng-controller="myCtrl">
<!--ng-model 即爲模型,與 scope 中的數據綁定在一塊兒-->
    單價:<input type="number" ng-model="price">
    <br/>數量:<input type="number" ng-model="nums">
    <!--{{expression}} 這個就是表達式,它會計算 expression 的值-->
    <br/>應付:<label>{{price * nums}}</label>
</div>
<script>
    var app = angular.module("myApp", []);
    app.controller("myCtrl", function($scope){
        $scope.price = 1;
        $scope.nums = 1;
    });
</script>
</body>
</html>
View Code

 

初始化:

  Angular 會找 ng-app 這個指明應用開始的指令,若找到,則:

    一、加載 ng-app 指令所指定的模塊(module)

    二、建立應用所需的 injector

    三、以 ng-app 所在的節點爲根節點,開始遍歷並編譯 DOM 樹

 

編譯器:

  Angular 提供的一項服務,用來遍歷 DOM 節點,查找特定的屬性

  編譯過程 2 階段:

    一、編譯:遍歷 DOM 節點,收集全部的指令,返回一個鏈接函數(link func)

    二、鏈接:將上一步收集的每一個指令與其所在的做用域(scope)鏈接生成一個實時視圖

爲何須要這 2 個階段:

  像 ng-repeat 會爲集合中的每一個項目克隆一個 DOM 元素,咱們僅須要編譯一次,再對每一個克隆元素進行鏈接,減少開銷

任何做用域中的模型改變都會實時地在視圖中反映出來,同時任何用戶與視圖的交互則會映射到做用域的模型中

  ==》做用域中的數據模型成爲了惟一的數據源

相關文章
相關標籤/搜索