Cordova webapp實戰(zhàn)開發(fā)(五)- AngularJS基礎(chǔ)篇(上)

隨說:
筆者只是將 《AngularJS權(quán)威教程》這本書讀了一遍报辱,并且將里面能列舉的內(nèi)容用自己的話理解了一遍然后整理出來,編寫順序是按書本順序作整理

1、 AngularJS數(shù)據(jù)綁定#

  1. 引入angular.js
  2. 在某個DOM元素上,明確設(shè)置ng-app屬性(只有被ng-app屬性的DOM元素區(qū)域才會受AngularJS影響)
  3. ng-model屬性是AngularJS的一個指令,將內(nèi)部數(shù)據(jù)模型對象的name綁定到文本輸入字段上
  4. 數(shù)據(jù)綁定的格式{{ name }}
<!DOCTYPE html>
// 設(shè)置ng-app屬性
<html ng-app>
    <head>
        <title>Simple app</title>
        // 引入JS
        <script
            src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.13/angular.js">
            </script>
    </head>
    <body>
         // 可以這樣理解紊婉,設(shè)置該DOM元素value值的KEY為name,然后可以通過{{ key }} , 獲取該value
        <input ng-model="name" type="text" placeholder="Your name">
            // 綁定數(shù)據(jù)
            <h1>Hello {{ name }}</h1>
            </body>
</html>

再看一個例子

<!doctype html>
<html ng-app>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.13/angular.js"></script>
    </head>
    <body>
        // DOM元素上 ng-controller 聲明所有被它包含的元素都屬于某個控制器。
        <div ng-controller="MyController">
        // 這里的{{clock}} 就是相當(dāng)于這個值 $scope.clock 辑舷, 也就是Date()函數(shù)的范圍值
        <h1>Hello {{ clock }}!</h1>
        </div>
        <script type="text/javascript">
            // MyController 函數(shù)接收了兩個參數(shù)喻犁, $scope , $timeout 
            function MyController($scope, $timeout) {
                var updateClock = function() {
                    $scope.clock = new Date();
                    $timeout(function() {
                             updateClock();
                             }, 1000);
                };
                updateClock();
            };
        </script>
    </body>
</html>

2、AngularJS模塊#

AngularJS模塊是定義應(yīng)用的最主要方式何缓,模塊包含了主要的應(yīng)用代碼株汉,一個應(yīng)用可以包含多個模塊,每一個模塊都包含了定義具體功能的代碼
模塊定義代碼 :

    //  第一個參數(shù) : 模塊名稱
    //  第二個參數(shù) : 依賴列表
    angular.module('name', []);

3歌殃、AngularJS作用域 - $scope#

AngularJS之$Scope

4乔妈、AngularJS控制器#

AngularJS的控制器是一個函數(shù),用來向視圖的作用域$scope中添加額外的功能氓皱。我們用它來給作用域?qū)ο笤O(shè)置初始狀態(tài)路召,并添加自定義行為。

新建一個js文件波材。(一般以業(yè)務(wù)命名)
例如下面 app.js
在app.js下寫上以下代碼

// 定義一個名字為app的 模塊股淡。
var app = angular.module('app', []);
// 創(chuàng)建一個新的控制器,AngularJS會生成并傳遞一個新的$scope給這個控制器廷区,
app.controller('FirstController', function($scope) {
 // 定義一個成員message并初始化值為“hello”
$scope.message = "hello";
});

AngularJS允許在$scope上升至包括對象在內(nèi)的任何類型的數(shù)據(jù)唯灵,并且在視圖中還可以展示對象的屬性。
例如 :

var app = angular.module('myApp', []);
// 創(chuàng)建一個名字叫MyController的控制器
app.controller('MyController', function($scope) {
// 在MyController上創(chuàng)建一個person對象隙轻,并為這個對象創(chuàng)建一個名字為name 的屬性埠帕,初始化值為Ari Lerner
$scope.person = {
name: 'Ari Lerner'
};
});


<div ng-app="myApp">
    // 在擁有ng-controller="MyController"的DOM元素內(nèi),或者任何子緣故中玖绿,都可以訪問person對象敛瓷,因為它是定義在$scope上的。
    <div ng-controller="MyController">
        <h1>{{ person }}</h1>
        and their name: <h2>{{ person.name }}</h2>
    </div>
</div>

控制器之間還可以嵌套斑匪,請看以下例子###

先創(chuàng)建兩個控制器

app.controller('ParentController', function($scope) {
     $scope.person = {greeted: false};
});
 app.controller('ChildController', function($scope) { $scope.sayHello = function() {
     $scope.person.name = 'Ari Lerner'; };
});

下面是實現(xiàn)呐籽,將ChildController嵌套于ParentController內(nèi)部,那childController的$scope對象的父級作用域就是ParentController的$scope對象。
我們可以在子作用域中狡蝶,訪問ParentController父作用域的內(nèi)容庶橱。

<div ng-controller="ParentController">
    <div ng-controller="ChildController">
        <a ng-click="sayHello()">Say hello</a>
    </div>
    {{ person }}
</div>

在ChildController并沒有定義person對象,可是卻可以訪問出對象贪惹,這就是控制器的嵌套關(guān)系苏章,當(dāng)子作用域中不存在對象時,會自動往上找馍乙,根作用域是rootScope

關(guān)于嵌套作用域之間,對象中的值的關(guān)系

// HTML代碼
<div ng-controller="SomeController">
        {{ someBareValue }}
        <button ng-click="someAction()">Communicate to child</button>
        <div ng-controller="ChildController">
        {{ someBareValue }}
        <button ng-click="childAction()">Communicate to parent</button>
        </div>
</div>

// JavaScript代碼
angular.module('myApp', [])
    .controller('SomeController', function($scope) {
          $scope.someBareValue = 'hello computer';
          $scope.someAction = function() {
          $scope.someBareValue = 'hello human, from parent';
    };
})
    .controller('ChildController', function($scope) {
          $scope.childAction = function() {
          $scope.someBareValue = 'hello human, from child';
    }; 
});

例子分析垫释。

點擊AAAA 丝格,執(zhí)行someAction() 函數(shù),someBareValue的值這個時候是屬于SomeController這個作用域下的棵譬,修改為'hello human, from parent',下面是點擊AAAA后的執(zhí)行結(jié)果

可以看到显蝌,在ChildController作用域下的someBareValue也改變了。由于繼承關(guān)系订咸,在ChildController作用域下的someBareValue實際上是通過父級對象從而獲取出來的曼尊。
那這個時候,如果點擊BBBBB脏嚷,則會執(zhí)行childAction()函數(shù)骆撇,也會修改someBareValue的值。效果如下


ChildController作用域下的someBareValue改變了父叙,可是父級對象中someBareValue并沒有改變神郊,這說明

子控制器是復(fù)制而非引用someBareValue的值的,JavaScript對象要么是值復(fù)制,要么是引用復(fù)制趾唱。字符竄涌乳、數(shù)字、和布爾型變量是值復(fù)制甜癞,數(shù)組夕晓、對象、和函數(shù)則是引用復(fù)制####

5悠咱、AngularJS表達(dá)式#

例如前面用到的 {{}} 也是一個表達(dá)式
用 {{}} 符號將一個變量綁定到$scope上的寫法本質(zhì)上就是一個表達(dá)式 :{{ expression }}

AngularJS在執(zhí)行$digest臟循環(huán)的過程中蒸辆,會自動解釋表達(dá)式,那如何手動解析表達(dá)式析既?

$parse服務(wù)####

在控制器中注入$parse服務(wù)(就是在創(chuàng)建contriller的時候吁朦,將$parse作為參數(shù)傳入去。)

angular.module("myApp", [])

.controller('MyController', function($scope,$parse) {
    // $watch的使用渡贾,就是逗宜,監(jiān)測ng-model="expr",的輸入,并且將新值,舊值纺讲,作用域返回
    $scope.$watch('expr', function(newVal, oldVal, scope) {
if (newVal !== oldVal) {
   // 注入$parse后就可以使用擂仍,用$parse設(shè)置parseFun,就等于利用了$parse服務(wù)解釋了得到的新值熬甚。
    var parseFun = $parse(newVal);
   // 定義parsedValue逢渔,并且調(diào)用parseFun,以此實現(xiàn)手動解析表達(dá)式
    $scope.parsedValue = parseFun(scope);
}
});
});

HTML代碼

<div ng-controller="MyController"> <input ng-model="expr"
type="text"
 placeholder="Enter an expression" /> 
<h2>{{ parseValue }}</h2>
</div>

$interpolate服務(wù)

字符竄模板中做插值操作乡括,利用了AngularJS 插值字符竄

<div ng-app="MyApp">
    <div ng-controller="MyController">
        <input ng-model="myName" type="text" placeholder="Type Your Name">
            <textarea ng-model="myTextarea" cols="30" rows="10"></textarea>
            <div ng-bind="interpolatedValue"></div>
            </div>
</div>
angular.module("MyApp", [])
// 在控制器中肃廓,我們設(shè)置了$watch來監(jiān)視郵件正文的變化,并將myTextarea屬性的值诲泌,進行字符插值后的結(jié)果賦值給myName屬性
.controller("MyController", function($scope, $interpolate){
$scope.$watch("myTextarea", function(newVal, oldVal, scope){
var interpolatedFunc = $interpolate(' templeat : ' + newVal);
// 將input綁定的值盲赊,傳入myName中
// interpolatedValue就是經(jīng)過插值后的新值。
$scope.interpolatedValue = interpolatedFunc({myName: $scope.myName});
});

});

標(biāo)識替換

假如你不想用 {{ }} 標(biāo)識開始與結(jié)束敷扫,你可以通過$inter polateProvider 進行配置
startSymbol() 方法修改標(biāo)識開始的符號
endSymbo() 方法修改標(biāo)識結(jié)束的符號

angular.module('emailParser', [])
.config(['$interpolateProvider', function($interpolateProvider) {
$interpolateProvider.startSymbol('__');
$interpolateProvider.endSymbol('__');
}])

6哀蘑、AngularJS過濾器#

過濾器就是用來過濾數(shù)據(jù),使數(shù)據(jù)以你希望的形式展示出來葵第,AngularJS有許多實用的內(nèi)置過濾器绘迁。

使用過濾器有兩種形式,HTML中調(diào)用過濾器卒密,與JavaScript中調(diào)用過濾器

在HTML中的模板綁定符號{{}}內(nèi)通過 | 符號來調(diào)用過濾器
例如 :

{{ name | uppercase }}

在JavaScript代碼中可以通過$filter 來調(diào)用過濾器缀台。
例如 :

app.controller('DemoController', ['$scope', '$filter',
function($scope, $filter) {
      $scope.name = $filter('uppercase')('Ari');
}]);

注意,可以用 | 符號作為分隔符來同時使用多個過濾器####

更多過濾器使用用法請參考這里

7哮奇、AngularJS指令#

創(chuàng)建自定義元素的函數(shù)稱作指令将硝,用.directive()方法創(chuàng)建,

.directive() 指令的使用屏镊。

例如依疼,我們自己定義一個標(biāo)簽 <myDir></myDir>

<div>
      <my-dir></my-dir>
</div>
angular.module('myApp', [])

.directive('myDir', function() {
       return { restrict: 'E',
       replace: true,
       template: '<a  };
});

結(jié)果,<my-dir></my-dir>被替換掉

<html ng-app>
    <head>
        <title>Simple app</title>
        <script
            src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.13/angular.js">
            </script>
    </head>
    <body>
        <div>
              <a >簡單來說而芥,你在上面看到的<my-dir>表情已經(jīng)沒了</a>
        </div>
    </body>
</html>

放一個自己的整理的例子

angular.module('myApp', [])
        
        .directive('myDirective', function() {
                   
          return {
                   //字符竄律罢, 可選,在DOM中以何種形式被聲明棍丐,E(元素)误辑,A(屬性) , C (類名), M(注釋)可單獨或者混合使用
                   restrict: String,
                   // 
                   priority: Number,
                   // 布爾型參數(shù),告訴AngularJS停止運行當(dāng)前元素上比本指令優(yōu)先級低的指令歌逢。
                   terminal: Boolean,
                   // 字符串或函數(shù)巾钉,可選,模板替換秘案。
                   template: String or Template Function:
                   // 字符竄貨函數(shù)砰苍,可選潦匈,一個可以接受兩個參數(shù)的函數(shù),并返回一個外部HTML文件路徑的字符竄
                   function(tElement, tAttrs) (...},
                           //   模板的URL                  
                           templateUrl: String,
                          // 布爾型赚导,可選 茬缩,默認(rèn)為false , 如果設(shè)置必須為true,
                          // false代表模板會被當(dāng)作子元素插入到調(diào)用此指令的元素內(nèi)部                     
                           replace: Boolean or String,
                           //  布爾型或?qū)ο蠛鹁桑蛇x凰锡,默認(rèn)為false
                           //  為true時,會自動從父作用域中繼承并創(chuàng)建一個新的作用域
                           //   
                            scope: Boolean or Object,
                            transclude: Boolean,
                            controller: String or
                            function(scope, element, attrs, transclude, otherInjectables) { ... }, controllerAs: String,
                           require: String,
                           link: function(scope, iElement, iAttrs) { ... },
                           compile: //
                                               
                           function(tElement, tAttrs, transclude) {
                                               
                           return {
                                               
                            pre: function(scope, iElement, iAttrs, controller) { ... },
                            post: function(scope, iElement, iAttrs, controller) { ... }
                            }
                            // 或者
                            return function postLink(...) { ... }
                }
       };
});

指令是AngularJS中用的最多圈暗,最常用的功能掂为,更多詳細(xì)請看這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市员串,隨后出現(xiàn)的幾起案子勇哗,更是在濱河造成了極大的恐慌,老刑警劉巖昵济,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件智绸,死亡現(xiàn)場離奇詭異野揪,居然都是意外死亡访忿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門斯稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來海铆,“玉大人,你說我怎么就攤上這事挣惰∥哉澹” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵憎茂,是天一觀的道長珍语。 經(jīng)常有香客問我,道長竖幔,這世上最難降的妖魔是什么板乙? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮拳氢,結(jié)果婚禮上募逞,老公的妹妹穿的比我還像新娘。我一直安慰自己馋评,他們只是感情好放接,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著留特,像睡著了一般纠脾。 火紅的嫁衣襯著肌膚如雪玛瘸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天乳乌,我揣著相機與錄音捧韵,去河邊找鬼。 笑死汉操,一個胖子當(dāng)著我的面吹牛再来,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磷瘤,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼芒篷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了采缚?” 一聲冷哼從身側(cè)響起针炉,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扳抽,沒想到半個月后篡帕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贸呢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年镰烧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楞陷。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡怔鳖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出固蛾,到底是詐尸還是另有隱情结执,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布艾凯,位于F島的核電站献幔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏趾诗。R本人自食惡果不足惜蜡感,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沧竟。 院中可真熱鬧铸敏,春花似錦、人聲如沸悟泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糕非。三九已至蒙具,卻和暖如春球榆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禁筏。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工持钉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篱昔。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓每强,卻偏偏與公主長得像,于是被迫代替她去往敵國和親州刽。 傳聞我的和親對象是個殘疾皇子空执,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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