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阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • 通过AngularJS仿豆瓣一刻的案例:https://github.com/zhongxiaolian/doub...
    中小恋阅读 1,726评论 1 21
  • 简介: AngularJS 是一个 JavaScript 框架。它可通过 标签添加到 HTML 页面。 Ang...
    JenniferYe阅读 1,396评论 0 13
  • AngularJS是什么?AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架。首先,它是...
    200813阅读 1,517评论 0 3
  • AngularJS AngularJS概述 介绍 简称:ng Angular是一个MVC框架 其他前端框架: Vu...
    我爱开发阅读 2,310评论 0 8
  • Angular JS 基础 本文中的AngularJS是AngularJS 1.x AngularJS是一个Jav...
    静候那一米阳光阅读 813评论 0 13