1. 程式人生 > >Angular.js基本概念和用法--(一雙向資料繫結)

Angular.js基本概念和用法--(一雙向資料繫結)

這個雙向資料繫結指的是從資料模型到檢視,從檢視到資料模型之間的雙向繫結。

前面介紹過AngularJS是一個MVC框架,我們在操作的時候主要是通過控制器進行操作的,讓控制器去修改資料模型,然後資料模型的變更會反映到檢視上。

內容簡介

1.最簡單的例子

2.取值表示式與ng-bind指令

3.雙向資料繫結的典型場景

4.動態切換標籤樣式

5.ng-show和ng-hide

6.ng-class

7.ngAnimate

一、最簡單的例子


還是原來這個例子,當你狂刷頁面的時候,你會發現,頁面會閃現出雙花括號。那這種情況該怎麼解決呢?很簡單AngularJS提供了ng-bind指令。


這樣的話即使網路不好也不會出現雙花括號了,那麼什麼時候用{{}}什麼時候用ng-bind呢?

一般在首頁index.html用ng-bind來繫結,因為要{{}}生效,必須等到所有的模組通過<script>標籤載入完成之後,而這些模組指令碼檔案都是存放在index.html檔案裡面的。

二、雙向資料繫結的典型場景

<div class="panel panel-primary">
        <div class="panel-heading">
            <div class="panel-title">雙向資料繫結</div>
        </div>
        <div class="panel-body">
            <div class="row">
                <div class="col-md-12">
                    <form class="form-horizontal" role="form" ng-controller="UserInfoCtrl">
                        <div class="form-group">
                            <label class="col-md-2 control-label">
                                郵箱:
                            </label>
                            <div class="col-md-10">
                                <input type="email" class="form-control" placeholder="推薦使用126郵箱" ng-model="userInfo.email">
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-md-2 control-label">
                                密碼:
                            </label>
                            <div class="col-md-10">
                                <input type="password" class="form-control" placeholder="只能是數字、字母、下劃線" ng-model="userInfo.password">
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <div class="checkbox">
                                    <label>
                                        <input type="checkbox" ng-model="userInfo.autoLogin">自動登入
                                    </label>
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <button class="btn btn-default" ng-click="getFormData()">獲取Form表單的值</button>
                                <button class="btn btn-default" ng-click="setFormData()">設定Form表單的值</button>
                                <button class="btn btn-default" ng-click="resetForm()">重置表單</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>

首先在<html>標籤上面設定一個啟動點<html ng-app="UserInfoModule">

然後在form表單裡面新增一個UserInfoCtrl控制器,在腳本里面編寫這個控制器的動作

var userInfoModule = angular.module('UserInfoModule', []);
userInfoModule.controller('UserInfoCtrl', ['$scope',
    function($scope) {
        $scope.userInfo = {
            email: "[email protected]
", password: "253445528", autoLogin: true }; $scope.getFormData = function() { console.log($scope.userInfo); }; $scope.setFormData = function() { $scope.userInfo = { email: '[email protected]', password: 'damoqiongqiu', autoLogin: false } }; $scope.resetForm = function() { $scope.userInfo = { email: "[email protected]", password: "253445528", autoLogin: true }; } } ])

最後用ng-model做資料繫結

三、動態切換標籤樣式

<div ng-controller="CSSCtrl">
       <p class="text-{{color}}">測試CSS樣式</p>
       <button class="btn btn-default" ng-click="setGreen()">綠色</button>
</div>
var myCSSModule = angular.module('MyCSSModule', []);
myCSSModule.controller('CSSCtrl', ['$scope',
    function($scope) {
        $scope.color = "red";
        $scope.setGreen = function() {
            $scope.color = "green";
        }
    }
])
.text-red {
    background-color: #ff0000;
}
.text-green {
    background-color: #00ff00;
}

效果:點選綠色按鈕之後,背景顏色變成綠色了,這個例子還是比較容易理解的。

但是這種方式有一些問題,如果{{color}}取值取錯了,那麼很有可能就會出錯了。這時候AngularJS提供了ng-class指令

<div ng-controller='HeaderController'>
    <div ng-class='{error: isError, warning: isWarning}'>{{messageText}}</div>
    <button ng-click='showError()'>Simulate Error</button>
    <button ng-click='showWarning()'>Simulate Warning</button>
</div>

我們看一下ng-class的寫法,當isError的值為false的時候,就不會用error這個樣式類,當他為true的時候就使用這個樣式類。

四、ng-show和ng-hide

<div ng-controller='DeathrayMenuController'>
    <button ng-click='toggleMenu()'>Toggle Menu</button>
    <ul ng-show='menuState.show'>
        <li ng-click='stun()'>Stun</li>
        <li ng-click='disintegrate()'>Disintegrate</li>
        <li ng-click='erase()'>Erase from history</li>
    </ul>
<div/>

當ng-show為true的時候顯示,false則隱藏,ng-hide的效果和ng-show相反。

五、ngAnimate

<div class="page {{pageClass}}" ng-view></div>
.page {
    bottom:0;
    padding-top:200px;
    position:absolute;
    text-align:center;
    top:0;
    width:100%;
}
.page h1 {
    font-size:60px;
}
.page a {
    margin-top:50px;
}
.hello {
    background:#00D0BC;
    color:#FFFFFF;
}
.list{
    background:#E59400;
    color:#FFFFFF;
}
@keyframes rotateFall {
    0% {
        transform: rotateZ(0deg);
    }
    20% {
        transform: rotateZ(10deg);
        animation-timing-function: ease-out;
    }
    40% {
        transform: rotateZ(17deg);
    }
    60% {
        transform: rotateZ(16deg);
    }
    100% {
        transform: translateY(100%) rotateZ(17deg);
    }
}
@keyframes slideOutLeft {
    to {
        transform: translateX(-100%);
    }
}
@keyframes rotateOutNewspaper {
    to {
        transform: translateZ(-3000px) rotateZ(360deg);
        opacity: 0;
    }
}
@keyframes scaleUp {
    from {
        opacity: 0.3;
        -webkit-transform: scale(0.8);
    }
}
@keyframes slideInRight {
    from {
        transform:translateX(100%);
    }
    to {
        transform: translateX(0);
    }
}
@keyframes slideInUp {
    from {
        transform:translateY(100%);
    }
    to {
        transform: translateY(0);
    }
}
.ng-enter {
    z-index: 8888;
}
.ng-leave {
    z-index: 9999;
}
.hello.ng-enter {
    animation: scaleUp 0.5s both ease-in;
}
.hello.ng-leave {
    transform-origin: 0% 0%;
    animation: rotateFall 1s both ease-in;
}
.list.ng-enter {
    animation:slideInRight 0.5s both ease-in;
}
.list.ng-leave {
    animation:slideOutLeft 0.5s both ease-in;
}

效果:


其實在使用ng-Animate的時候,具體操作只需要在css 樣式表裡面操作就可以了。

在上面的html標籤裡面,有一個{{pageClass}},這個繫結的值是在js腳本里面對應的控制器進行賦值的,我們可以看到在不同的控制器裡面,這個變數有不同的賦值

var bookStoreCtrls = angular.module('bookStoreCtrls', []);

bookStoreCtrls.controller('HelloCtrl', ['$scope',
    function($scope) {
        $scope.greeting = {
            text: 'Hello'
        };
        $scope.pageClass="hello";
    }
]);

bookStoreCtrls.controller('BookListCtrl', ['$scope',
    function($scope) {
        $scope.books = [{
            title: "《Ext江湖》",
            author: "大漠窮秋"
        }, {
            title: "《ActionScript遊戲設計基礎(第二版)》",
            author: "大漠窮秋"
        }, {
            title: "《用AngularJS開發下一代WEB應用》",
            author: "大漠窮秋"
        }];
        $scope.pageClass="list";
    }
]);
一個為$scope.pageClass="hello";另一個為$scope.pageClass="list";但是這僅僅實現的是靜態的樣式,動態的效果呢?

在上面的css中,最需要注意的是我們通過@keyframes定義了好幾個動畫的css,呼叫的時候是通過AngularJS內建的css樣式來呼叫。

.ng-enter {
    z-index: 8888;
}
.ng-leave {
    z-index: 9999;
}
.hello.ng-enter {
    animation: scaleUp 0.5s both ease-in;
}
.hello.ng-leave {
    transform-origin: 0% 0%;
    animation: rotateFall 1s both ease-in;
}
.list.ng-enter {
    animation:slideInRight 0.5s both ease-in;
}
.list.ng-leave {
    animation:slideOutLeft 0.5s both ease-in;
}
要注意的是.hello.ng-enter這兩個樣式類之間是沒有空格的,這是一個坑。