AngularJS學習筆記(一) 關於MVVM和雙向綁定

寫在前面:

     由於須要開始學習ng,以前在知乎上聽大神們介紹ng的時候說這個坑如何的大,學了一陣(其實也就三天),感受ng作的很大很全,在合適的情境你能夠徹底使用ng搞定一切。這一點從諸如jqLite之類的雞肋就能看出來了。因此搞得ng很大。。css

    更主要的是,ng用一種和以前徹底不一樣的思惟方式去組織代碼,它就是Model-View-ViewModel(MVVM)。html

    這篇文章結構大概是1.MVVM和雙向綁定 2.簡單的購物金額計算的例子(轉自miaov視頻)。若有問題還請看客斧正。^_^前端

    1.MVVM和雙向綁定

     先上個圖(也是我從別的地方找的)ajax

    angular中的MVVM

     我對MV*這類架構模式的幾個成員還不是很分的清楚。而angular乍看起來很像模板引擎一類的東西。以往,大部分的內容都是寫在html裏的,可是這樣作對於須要頻繁修改內容的頁面就帶來了一些問題:json

                                 1.每個可能修改的部分可能都須要寫一套邏輯;一樣的,若是用戶經過頁面須要頻繁傳輸信息(事件、文字等)也會須要很多代碼。數組

                                 2.以往在用jq或者js寫代碼的時候,都是以dom操做爲核心的:用選擇器找到dom,而後讓它幹啥。一旦html結構改變,對於那麼代碼就要重寫。架構

    而ng來說在這方面就有比較大的優點了app

(1)angular中的MVVM

    MVVM的做用歸納來講就是實現表現和數據分離dom

    Model(M):數據,數組,對象,json,存儲着內容。post

    View(V):視圖,用戶看到的部分,用戶能操做的東西,也許這就是最開始的前端須要作的東西(html+css)

    ViewModel(VM):想讓數據展現給用戶,須要必定的邏輯,這一層就是用來處理這些邏輯的。

    其實遇到那些個不能寫死在頁面上的,須要js控制的的東西(好比ajax的那些個信息),其實就有點表現和數據分離的意思了。不過angular把這件事情作得比較完全。更重要的是它能夠自動更新,而不用你去寫偵聽代碼。

    MVVM中M和V不能直接通訊,單向雙向都不行,而都須要VM這個中介。爲何這個中介叫VM呢?在我看來,VM自己就是M在js中的一種映射:

   ng-controller對應$scope  每一個標籤對應一個ng-model scope的嵌套關係很像dom樹(固然,我以爲在ng中仍是多在scope上作文章,少用dom找元素)。ng的相互自動更新的兩個對象就是VM中的ng-model對應變量和V中的標籤

(2)關於雙向更新

ng-model固然能夠作到雙向綁定。可是並非全部映射都是雙向的,好比{{}}和ng-bind就只能VM到V,而ng-click等事件明顯又是隻能V到VM的。

2.實例:購物金額計算

<!DOCTYPE html>
<html ng-app>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div ng-controller="Aaa">
    <p>單價:<input type="text" ng-model="price"></p>
    <p>數量:<input type="text" ng-model="num"></p>
    <p>費用:<span>{{fee()|currency:'¥' }}</span></p>
    <p>運費:<span>{{post|currency:'¥' }}</span></p>
    <p>總額:<span>{{fee()+post|currency:'¥' }}</span></p>
</div>
</body>
<script src="angular.min.js"></script>
<script>
    function Aaa($scope){
        $scope.price=5;
        $scope.num=1;
        $scope.fee=function(){
            return $scope.price*$scope.num;
        }
        $scope.$watch($scope.fee,function(newVal,oldVal){
            $scope.post=(newVal>=100)?0:10;
        });
    }
</script>
</html>

正如上面說的,由於input須要向VM傳輸數據,因此使用 ng-model。而span標籤中的三項只是須要VM到V就能夠了,因此用了雙大括號。

其中涉及到的ng的語法啥的就不說了,$scope之後會詳細的說明。稍微提一下$watch,它在我看來相似一個事件,這個事件在指定的變量改變/方法執行的時候觸發。它能夠把兩個變量(ng-model)創建起聯繫。讓一個ng-model隨着另外一個的變化而變化。

固然這種變化是單向的,我猜測要是兩個變量互相寫$watch的話會發生比較恐怖的事情吧,有空試一試~

第一部分到此結束,下一步會寫一個表單驗證相關的例子,裏面會提到ng-repeat和filter。

相關文章
相關標籤/搜索