AngularJS 模型+Scope(作用域)+控制器+過濾器

AngularJS ng-model 指令模型)

ng-model 指令用于綁定應用程序數據到 HTML 控制器(input, select, textarea)的值。


ng-model 指令
ng-model 指令可以將輸入域的值與 AngularJS 創建的變量綁定。

// AngularJS 實例
<div ng-app="myApp" ng-controller="myCtrl">    
    名字: <input ng-model="name">
</div>
<script>
  var app = angular.module('myApp', []);
  app.controller('myCtrl', function($scope) {    
      $scope.name = "John Doe";
  });
</script>

嘗試一下 ?


雙向綁定
雙向綁定,在修改輸入域的值時, AngularJS 屬性的值也將修改:

// AngularJS 實例
<div ng-app="myApp" ng-controller="myCtrl">    
    名字: <input ng-model="name">    
    <h1>你輸入了: {{name}}</h1>
    <!-- 或者使用 ng-bind -->
    <h1>你輸入了: <span ng-bind="name"></span></h1>
</div>

嘗試一下 ?


驗證用戶輸入

// AngularJS 實例
<form ng-app="" name="myForm">    
    Email:    
    <input type="email" name="myAddress" ng-model="text">    
    <span ng-show="myForm.myAddress.$error.email">不是一個合法的郵箱地址</span>
</form>

嘗試一下 ?
<small>以上實例中,提示信息會在 ng-show 屬性返回 true 的情況下顯示。</small>


應用狀態
ng-model 指令可以為應用數據提供狀態值(invalid, dirty, touched, error):

// AngularJS 實例
<form ng-app="" name="myForm" ng-init="myText = 'test@runoob.com'">    
    Email:    
    <input type="email" name="myAddress" ng-model="myText" required>    
    <h1>狀態</h1>    
    {{myForm.myAddress.$valid}}    
    {{myForm.myAddress.$dirty}}    
    {{myForm.myAddress.$touched}}
</form>

嘗試一下 ?


CSS 類
ng-model 指令基于它們的狀態為 HTML 元素提供了 CSS 類:

// AngularJS 實例
<style>
input.ng-invalid {    
    background-color: lightblue;
}
</style>
<body>
<form ng-app="" name="myForm">            
   輸入你的名字:    
   <input name="myAddress" ng-model="text" required>
</form>

嘗試一下 ?
ng-model 指令根據表單域的狀態添加/移除以下類:

  • ng-empty
  • ng-not-empty
  • ng-touched
  • ng-untouched
  • ng-valid
  • ng-invalid
  • ng-dirty
  • ng-pending
  • ng-pristine


AngularJS Scope(作用域)

Scope(作用域) 是應用在 HTML (視圖) 和 JavaScript (控制器)之間的紐帶。
Scope 是一個對象,有可用的方法和屬性。
Scope 可應用在視圖和控制器上。


如何使用 Scope

當你在 AngularJS 創建控制器時,你可以將 $scope 對象當作一個參數傳遞:

// AngularJS 實例
// 控制器中的屬性對應了視圖上的屬性:
<div ng-app="myApp" ng-controller="myCtrl">
  <h1>{{carname}}</h1>
</div>
<script>
  var app = angular.module('myApp', []);
  app.controller('myCtrl', function($scope) {    
    $scope.carname = "Volvo";
  });
</script>

嘗試一下 ?
<small>當在控制器中添加 $scope 對象時,視圖 (HTML) 可以獲取了這些屬性。
視圖中,你不需要添加 $scope 前綴, 只需要添加屬性名即可,如: {{carname}}。</small>


Scope 概述

AngularJS 應用組成如下:

  • View(視圖), 即 HTML。
  • Model(模型), 當前視圖中可用的數據。
  • Controller(控制器), 即 JavaScript 函數,可以添加或修改屬性。

scope 是模型。
scope 是一個 JavaScript 對象,帶有屬性和方法,這些屬性和方法可以在視圖和控制器中使用。
<small>AngularJS 實例
如果你修改了視圖,模型和控制器也會相應更新:</small>

<div ng-app="myApp" ng-controller="myCtrl">
  <input ng-model="name">
  <h1>我的名字是 {{name}}</h1>
</div>
<script>
  var app = angular.module('myApp', []);
  app.controller('myCtrl', function($scope) {    
    $scope.name = "John Dow";
  });
</script>

嘗試一下 ?


Scope 作用范圍

了解你當前使用的 scope 是非常重要的。
在以上兩個實例中,只有一個作用域 scope,所以處理起來比較簡單,但在大型項目中, HTML DOM 中有多個作用域,這時你就需要知道你使用的 scope 對應的作用域是哪一個。
<small>AngularJS 實例
當我們使用 ng-repeat 指令時,每個重復項都訪問了當前的重復對象:</small>

<div ng-app="myApp" ng-controller="myCtrl">
  <ul>    
    <li ng-repeat="x in names">{{x}}</li>    
  </ul>
</div>
<script>
  var app = angular.module('myApp', []);
  app.controller('myCtrl', function($scope) {    
    $scope.names = ["Emil", "Tobias", "Linus"];
  });
</script>

嘗試一下 ?
<small>每個 < li> 元素可以訪問當前的重復對象,這里對應的是一個字符串, 并使用變量 x 表示。</small>


根作用域

所有的應用都有一個 $rootScope,它可以作用在 ng-app 指令包含的所有 HTML 元素中。
$rootScope 可作用于整個應用中。是各個 controller 中 scope 的橋梁。用 rootscope 定義的值,可以在各個 controller 中使用。
<small>AngularJS 實例
創建控制器時,將 $rootScope 作為參數傳遞,可在應用中使用:</small>

<div ng-app="myApp" ng-controller="myCtrl">
  <h1>{{lastname}} 家族成員:</h1>
  <ul>      
    <li ng-repeat="x in names">{{x}} {{lastname}}</li>
  </ul>
</div>
<script>
  var app = angular.module('myApp', []);
  app.controller('myCtrl', function($scope, $rootScope) {    
    $scope.names = ["Emil", "Tobias", "Linus"];    
    $rootScope.lastname = "Refsnes";
  });
</script>


AngularJS 控制器

AngularJS 控制器 控制 AngularJS 應用程序的數據。
AngularJS 控制器是常規的 JavaScript 對象


AngularJS 控制器

AngularJS 應用程序被控制器控制。
ng-controller 指令定義了應用程序控制器。
控制器是 JavaScript 對象,由標準的 JavaScript 對象的構造函數 創建。
<small>AngularJS 實例</small>

<div ng-app="myApp" ng-controller="myCtrl">
    名: <input type="text" ng-model="firstName"><br>
    姓: <input type="text" ng-model="lastName"><br>
    <br>
     姓名: {{firstName + " " + lastName}}
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {        
  $scope.firstName = "John";    $scope.lastName = "Doe";});</script>

嘗試一下 ?
<small>應用解析:
AngularJS 應用程序由 ng-app 定義。應用程序在 <div> 內運行。
ng-controller="myCtrl" ?屬性是一個 AngularJS 指令。用于定義一個控制器。
myCtrl 函數是一個 JavaScript 函數。
AngularJS 使用$scope 對象來調用控制器。
在 AngularJS 中, $scope 是一個應用對象(屬于應用變量和函數)。
控制器的 $scope (相當于作用域、控制范圍)用來保存AngularJS Model(模型)的對象。
控制器在作用域中創建了兩個屬性 (firstNamelastName)。
ng-model 指令綁定輸入域到控制器的屬性(firstName 和 lastName)。</small>


控制器方法

<small>上面的實例演示了一個帶有 lastName 和 firstName 這兩個屬性的控制器對象。
控制器也可以有方法(變量和函數):</small>
AngularJS 實例

<div ng-app="myApp" ng-controller="personCtrl">
    名: <input type="text" ng-model="firstName"><br>
    姓: <input type="text" ng-model="lastName"><br>
    <br>姓名: {{fullName()}}
</div>
<script>
    var app = angular.module('myApp', []);
    app.controller('personCtrl', function($scope) {    
      $scope.firstName = "John";    
      $scope.lastName = "Doe";    
      $scope.fullName = function() {        
      return $scope.firstName + " " + $scope.lastName;    
      }});
  </script>

嘗試一下 ?


外部文件中的控制器

<small>在大型的應用程序中,通常是把控制器存儲在外部文件中。
只需要把 <script> 標簽中的代碼復制到名為 personController.js 的外部文件中即可:
AngularJS 實例</small>

<div ng-app="myApp" ng-controller="personCtrl">
  First Name: <input type="text" ng-model="firstName"><br>
  Last Name: <input type="text" ng-model="lastName"><br>
  <br>
  Full Name: {{firstName + " " + lastName}}
</div>
<script src="personController.js"></script>

嘗試一下 ?


其他實例
<small>以下實例創建一個新的控制器文件:

angular.module('myApp', []).controller('namesCtrl', function($scope) { 
  $scope.names = [ 
    {name:'Jani',country:'Norway'}, 
    {name:'Hege',country:'Sweden'}, 
    {name:'Kai',country:'Denmark'}
  ];
});

保存文件為 namesController.js:
然后,在應用中使用控制器文件:
AngularJS 實例</small>

<div ng-app="myApp" ng-controller="namesCtrl">
  <ul>  
    <li ng-repeat="x in names">    
      {{ x.name + ', ' + x.country }}  
    </li>
  </ul>
</div>
<script src="namesController.js"></script>

嘗試一下 ?



AngularJS 過濾器

<small>過濾器可以使用一個管道字符(|)添加到表達式和指令中。</small>

AngularJS 過濾器

AngularJS 過濾器可用于轉換數據:


表達式中添加過濾器

<small>過濾器可以通過一個管道字符(|)和一個過濾器添加到表達式中。.
((下面的兩個實例,我們將使用前面章節中提到的 person 控制器))
uppercase 過濾器將字符串格式化為大寫:
AngularJS 實例

<div ng-app="myApp" ng-controller="personCtrl">
  <p>姓名為 {{ lastName | uppercase }}</p>
</div>

</small>
嘗試一下 ?
<small>lowercase 過濾器將字符串格式化為小寫:
AngularJS 實例</small>

<div ng-app="myApp" ng-controller="personCtrl">
  <p>姓名為 {{ lastName | lowercase }}</p>
</div>

嘗試一下 ?


currency 過濾器

<small>currency 過濾器將數字格式化為貨幣格式:
AngularJS 實例</small>

<div ng-app="myApp" ng-controller="costCtrl">
  <input type="number" ng-model="quantity">
  <input type="number" ng-model="price">
  <p>總價 = {{ (quantity * price) | currency }}</p>
</div>

嘗試一下 ?


向指令添加過濾器

<small>過濾器可以通過一個管道字符(|)和一個過濾器添加到指令中。
orderBy 過濾器根據表達式排列數組:
AngularJS 實例</small>

<div ng-app="myApp" ng-controller="namesCtrl">
  <ul>  
    <li ng-repeat="x in names | orderBy:'country'">    
      {{ x.name + ', ' + x.country }}  
    </li>
  </ul>
</div>

嘗試一下 ?


過濾輸入

<small>輸入過濾器可以通過一個管道字符(|)和一個過濾器添加到指令中,該過濾器后跟一個冒號和一個模型名稱。
filter 過濾器從數組中選擇一個子集:
AngularJS 實例</small>

<div ng-app="myApp" ng-controller="namesCtrl">
  <p><input type="text" ng-model="test"></p>
  <ul>  
    <li ng-repeat="x in names | marked" style="border: 0px; margin: 0px; padding: 0px;">filter:test | orderBy:'country'">    
      {{ (x.name | uppercase) + ', ' + x.country }}  
    </li>
  </ul>
</div>

嘗試一下 ?

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

推薦閱讀更多精彩內容

  • 通過AngularJS仿豆瓣一刻的案例:https://github.com/zhongxiaolian/doub...
    中小戀閱讀 1,769評論 1 21
  • 簡介: AngularJS 是一個 JavaScript 框架。它可通過 標簽添加到 HTML 頁面。 Ang...
    JenniferYe閱讀 1,434評論 0 13
  • AngularJS是什么?AngularJs(后面就簡稱ng了)是一個用于設計動態web應用的結構框架。首先,它是...
    200813閱讀 1,625評論 0 3
  • AngularJS AngularJS概述 介紹 簡稱:ng Angular是一個MVC框架 其他前端框架: Vu...
    我愛開發閱讀 2,347評論 0 8
  • Angular JS 基礎 本文中的AngularJS是AngularJS 1.x AngularJS是一個Jav...
    靜候那一米陽光閱讀 862評論 0 13