angularjs速成

優勢

通過雙向綁定的方式,可以減少對html 的 dom元素的操作,減少代碼。把數據跟頁面展示隔離,代碼邏輯清晰。

雙向綁定概念

AngularJS的數據綁定是數據模型(model)與視圖(view)組件的自動同步。Angular的實現方式允許你把應用中的模型看成單一數據源。而視圖始終是數據模型的一種展現形式。當模型改變時,視圖就能反映這種改變,反之亦然。

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <div ng-controller="HelloAngular">
            <input ng-model="greeting.text"/>
            <p>{{greeting.text}},Angular</p>
        </div>
    </body>
    <script src="js/angular-1.3.0.js"></script>
    <script src="HelloAngular_MVC.js"></script>
</html>
var myModule = angular.module('MyModule', []);
 
myModule .controller('HelloAngular', ['$scope',
    $scope.greeting = {
        text: 'Hello'
    };
]);

AngularJS的scope中的數據模型綁定了的前臺View中,那么前臺的數據變化是否會影響到數據模型,通過改變input中的值。

我們可以通過對html元素的值跟js的變量進行綁定,通過操作js對象的值,達到html頁面的變化。

作用域

AngularJs中的$scope對象是模板的域模型,也稱為作用域實例.通過為其屬性賦值,可以傳遞數據給模板渲染。 每個$scope都是Scope類的實例,Scope類有很多方法,用于控制作用域的生命周期、提供事件傳播功能,以及支持模板的渲染等。 AngularJs的每個應用程序都有一個$rootScope,它是其他所有作用域的父作用域,它的作用范圍從包含ng-app指令的HTML元素開始.它是在新應用啟動時自動創建。

  1. 會創建新的子作用域,并且進行原型繼承: ng-repeat、ng-include、ng-switch、ng-view、ng-controller, 用scope: true和transclude: true創建directive

  2. 以下方式會創建新的獨立作用域,不會進行原型繼承:用scope: { ... }創建directive。這樣創建的作用域被稱為"Isolate"作用域

  3. scope.$parent指向scope的父作用域;
    scope.$$childHead指向scope的第一個子作用域;
    scope.$$childTail指向scope的最后一個子作用域;
    scope.$$nextSibling指向scope的下一個相鄰作用域;
    scope.$$prevSibling指向scope的上一個相鄰作用域;

  4. 通過瀏覽器的控制臺可以清晰的看到作用域之間的關系

作用域的圖片.png

controller 概念

在angularJS中,controlle是一個javascript函數/類,用于操作作用域中,各個對象的初始狀態以及相應的行為。

  1. html 寫法
<body ng-app="Hello">  
  <p> {{name}}</p>  
  <div ng-controller="helloCtrl">  
    {{name}}  
  </div>  
  </body>
  1. js寫法

推薦這種寫法,后面對js文件進行壓縮才不會報錯。

app.controller('helloCtrl',['$scope', function ($scope) {  
    $scope.name = "菲爾";  
}]); 

service

它是一個單例對象或函數,對外提供特定的功能。它與我們自己定義一個function然后在其他地方調用不同,因為服務被定義在一個模塊中,所以它的作用范圍是可以被我們來管理的,ng避免全局變量污染意識是非常強的。有三種不同的寫法,下面列出常用的一種寫法:表示helloService 是服務于app模塊的。

app.service('helloService',function(){
    return{
      message:'this is helloService'
    }
})

需要引用的時候,只要把helloService 傳入就可以用的:

app.controller('helloCtrl',['$scope', 'helloService',function ($scope,helloService) {  
    $scope.name = helloService.message;  
}]);

基本標簽使用

ng-app

告訴Angular他應該管理頁面的那一部分,可以放在html元素上也可以放在div等標簽上

<html ng-app="problem">
ng-controller

控制器,通過在body標簽上包含一個控制器,則可以管理body標簽之間的任何東西,也可以放在div上,來控制這一個div上的任何東西

<body ng-controller="problemController">
ng-repeat

數組中每個元素進行for循環

<tr ng-repeat="info in problem.infos">
                <td>
                  <div>
                      <p>{{info.ClientOrgName}}</p>
                      <p>({{info.ClientPerson}}  {{info.ClientPhone}})</p>
                  </div>
                </td>
                <td>{{info.BusinessName}}</td>
                <td>
                        <a href="" ng-click="problem.viewProblemDepict($index)">{{info.ProblemDepict}}</a>
                </td>
                    <td>{{info.CreatePerson}}</td>
                <td>
                      <div ng-if="info.State==3"></div>
                      <div ng-else>{{info.RealName}}</div>
                </td>
                <td>
                  <div ng-if="info.State==1">未解決</div>
                  <div ng-if="info.State==2">已解決</div>
                  <div ng-if="info.State==3">完成</div>
              </td>
 </tr>
ng-model

進行雙向綁定

<html ng-app>
<head>
    <meta charset="utf-8">
    <title>ng-model directive</title>
</head>
<body ng-controller="HelloController">
<div>
    <p>雙向綁定</p>
    <input ng-model="greeting">
    <p>Hello {{greeting || "World"}}</p>
    <button ng-click="init()">重置</button>
    <hr>
</div>

<script src="../lib/angularjs/1.2.26/angular.min.js"></script>
<script>
    function HelloController($scope) {
        $scope.init = function() {
            $scope.greeting = "Hello";
        }
    }
</script>
</body>
</html>
ng-bind 和 {{}}

進行單項綁定,從scope-->html,當變量發生變化,html頁面會自動變化。

ng-class

可以通過變量控制樣式的顯示。

function ctrl($scope) {   
    $scope.isSelected = true;  
} 
<div ng-class="{true:'selected',false:'unselected'}[isSelected]"></div> 
ng-select ,ng-option

下拉框的選擇的標簽

<html xmlns="http://www.w3.org/1999/xhtml" ng-app="app">
<head>
    <title>select</title>
    <script src="JS/angular.min.js"></script>
    <script>
        var app = angular.module('app', []);
        app.controller('selectController', function ($scope) {
            $scope.mycity = '北京';
            $scope.Cities = [{ id: 1, name: '北京' }, { id: 2, name: '上海' }, { id: 3, name: '廣州' }];
        });
    </script>
</head>
<body>
    <div ng-controller="selectController">
        <select ng-model="mycity" ng-options="city for city in Cities"></select>
    </div>
</body>
</html>
ng-click,ng-change 事件方法

這個跟原生的js的調用方式一樣

ng-src、ng-href

當對應的圖片,地址內容是包括了變量,需要用到這兩個屬性,要不會報404的錯誤。

過濾器 filter

uppercase|lowercase:大小寫轉換過濾
json:json格式過濾
date:日期格式過濾
number:數字格式過濾
currency:貨幣格式過濾
filter:查找
limitTo:字符串對象截取
orderBy:對象排序

<html lang="zh_CN">  
<head>  
    <meta charset="UTF-8">  
    <title>Angular基礎</title>  
</head>  
<body>  
<div ng-app="myApp">  
  
        <!-- 向表達式添加過濾器:可以通過一個管道字符(|)和一個過濾器添加到表達式中-->  
        <p>將字符串轉換為大小寫:</p>  
        <div ng-controller="uppercaseController">  
            <p>姓名為 {{ person.lastName | uppercase }}</p>  
        </div>  
        <div ng-controller="lowercaseController">  
            <p>姓名為 {{ person.lastName | lowercase }}</p>  
        </div>  
  
        <p>貨幣過濾:</p>  
        <div ng-controller="costController">  
            數量:<input type="number" ng-model="quantity">  
            價格:<input type="number" ng-model="price">  
            <p>總價 = {{ (quantity * price) | currency }}</p>  
            {{250 |currency:"RMB ¥"}}  
        </div>  
  
        <!-- 向指令添加過濾器:可以通過一個管道字符(|)和一個過濾器添加到指令中-->  
        <p>按國家的字母順序排序對象:</p>  
        <div ng-controller="namesController">  
            <p>循環對象:</p>  
            <ul>  
                <li ng-repeat="x in names | orderBy:'country'">  
                    {{ x.name + ', ' + x.country }}  
                </li>  
            </ul>  
            <!--json格式過濾-->  
            {{jsonText | json}}     <br/>  
            <!--date格式過濾-->  
            <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss'}}</span><br/>  
            <!--number格式過濾-->  
            {{1.2345678 |number:1}}<br/>  
            <!--字符串截取-->  
            {{ "i love tank" | limitTo:6 }}<br/>  
            {{ "i love tank" | limitTo:-6 }}<br/>  
            <!--對象排序:降序-->  
            {{ [{"age": 20,"id": 10,"name": "iphone"},  
            {"age": 12,"id": 11,"name": "sunm xing"},  
            {"age": 44,"id": 12,"name": "test abc"}  
            ] | orderBy:'id':true }}<br/>  
            <!--對象排序:升序-->  
            {{ [{"age": 20,"id": 10,"name": "iphone"},  
            {"age": 12,"id": 11,"name": "sunm xing"},  
            {"age": 44,"id": 12,"name": "test abc"}  
            ] | orderBy:'id' }}  
        </div>  
        <p>按輸入的字母顯示對象:</p>  
        <div ng-controller="namesFilterController">  
            <p>輸入過濾:</p>  
            <p><input type="text" ng-model="name"></p>  
            <ul>  
                <li ng-repeat="x in names | filter:name | orderBy:'country':true">  
                    {{ (x.name | uppercase) + ', ' + x.country }}  
                </li>  
            </ul>  
            <p>name篩選:</p>  
            <ul>  
                <li ng-repeat="x in names | filter:{'name':name} | orderBy:'country':true">  
                    {{ (x.name | uppercase) + ', ' + x.country }}  
                </li>  
            </ul>  
  
            {{ [{"age": 20,"id": 10,"name": "iphone"},  
            {"age": 12,"id": 11,"name": "sunm"},  
            {"age": 44,"id": 12,"name": "test abc"}  
            ] | filter:{'name':'sunm'} }}  
        </div>  
  
</div>  
<script src="angular.min.js"></script>  
<script type="application/javascript">  
    var myApp=angular.module('myApp',[]);  
    myApp.controller('uppercaseController',function($scope){  
        $scope.person = {  
            firstName: "John",  
            lastName: "Doe"  
        };  
    });  
    myApp.controller('lowercaseController',function($scope){  
        $scope.person = {  
            firstName: "John",  
            lastName: "Doe"  
        };  
    });  
    myApp.controller('costController',function($scope){  
        $scope.quantity = 1;  
        $scope.price = 9.99;  
    });  
    myApp.controller('namesController',function($scope){  
        $scope.names = [  
            {name:'Jani',country:'Norway'},  
            {name:'Hege',country:'Sweden'},  
            {name:'Kai',country:'Denmark'}  
        ];  
        $scope.jsonText={foo:"bar",baz:23};  
    });  
    myApp.controller('namesFilterController',function($scope){  
        $scope.names = [  
            {name:'Jani',country:'Norway'},  
            {name:'Hege',country:'Sweden'},  
            {name:'Kai',country:'Denmark'}  
        ];  
    });  
  
</script>  
</body>  
</html> 

自定義標簽

var myApp = angular.module('myApp', [])
    .directive('myDirective', function() {
    return {
        restrict: 'A',
        replace: true,
        scope:{},
        templateUrl:function(){
              return "";
        },
        controller:function(){
        }
    };
})

####### restrict:
該屬性用于定義指令以什么形式被使用,這是一個可選參數,本文開頭定義的指令用的也是A,其實該選項默認為A。
也就是元素(E)、屬性(A)、類(C)、注釋(M)

####### replace:
默認值為false,以文章開頭定義的指令為例,假設我們這樣調用了指令

<my-directive></my-directive>  

replace為true時,輸出:

<p>Kavlez</p>

replace為false時,輸出:

<my-directive><p>Kavlez</p></my-directive>  

####### scope:(Boolean/Object)
默認為false,true時會從父作用域繼承并創建一個自己的作用域.
如果是一個對象的話,是進行了作用域的隔離,可以通過下面的例子看一下,是怎么關聯:

angular.module("MyApp", [])
    .controller("MyController", function ($scope) {
    $scope.name = "dreamapple";
    $scope.age = 20;
    $scope.changeAge = function(){
        $scope.age = 0;
    }
})
    .directive("myDirective", function () {
    var obj = {
        restrict: "AE",
        scope: {
            name: '@myName',
            age: '=',
            changeAge: '&changeMyAge'
        },
        replace: true,
        template: "<div class='my-directive'>" +
            "<h3>下面部分是我們創建的指令生成的</h3>" +
            "我的名字是:<span ng-bind='name'></span><br/>" +
            "我的年齡是:<span ng-bind='age'></span><br/>" +
            "在這里修改名字:<input type='text' ng-model='name'><br/>" +
            "<button ng-click='changeAge()'>修改年齡</button>" +
            " </div>"
    }
    return obj;
});
<div ng-app="MyApp">
    <div class="container" ng-controller="MyController">
        <div class="my-info">我的名字是:<span ng-bind="name"></span>

            <br/>我的年齡是:<span ng-bind="age"></span>
            <br />
        </div>
        <div class="my-directive" my-directive my-name="{{name}}" age="age"  change-my-age="changeAge()"></div>
    </div>
</div>

@
這是一個單項綁定的前綴標識符
使用方法:在元素中使用屬性,好比這樣<div my-directive my-name="{{name}}"></div>,注意,屬性的名字要用-將兩個單詞連接,因為是數據的單項綁定所以要通過使用{{}}來綁定數據。

=
這是一個雙向數據綁定前綴標識符
使用方法:在元素中使用屬性,好比這樣<div my-directive age="age"></div>,注意,數據的雙向綁定要通過=前綴標識符實現,所以不可以使用{{}}。

&
這是一個綁定函數方法的前綴標識符
使用方法:在元素中使用屬性,好比這樣<div my-directive change-my-age="changeAge()"></div>,注意,屬性的名字要用-將多個個單詞連接。
如果需要傳入參數的時候,需要在標簽里面入參數傳入一個對象{name:""},
在 html里面的綁定的方法寫入這個key值,例如:<div my-directive change-my-age="changeAge(name)"></div>

####### templateUrl:
通過URL請求一個模板。 String類型時,templateURL自然是一個URL。 Function類型時返回一段字符串作為模板URL
####### controller:
這個是把標簽的一些邏輯通過控制器進行處理。

調試插件

firefox瀏覽器可以安裝 firebug,angScope 插件,可以看到對應的作用域的數據。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容