【AngularJS学习笔记】01 指令、服务和过滤器
AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-。
比如:
ng-app 指令初始化一个 AngularJS 应用程序。注意ng-app一般为空,如果值不为空,就得加这样一句代码var app = angular.module('名字', []);
ng-init 指令初始化应用程序数据。
这个在之前已经说过了,下面讲一下之前没讲到的。
ng-repeat指令与ng-options指令
<!--一般ng-repeat通常用于ul与li这种列表和表格-->
<div ng-app="" ng-init="names=[
{name:'Jani',country:'Norway'},
{name:'Hege',country:'Sweden'},
{name:'Kai',country:'Denmark'}]">
<p>循环对象:</p>
<ul>
<li ng-repeat="x in names">
{{ x.name + ', ' + x.country }}
</li>
</ul>
</div>
<!--一般ng-options通常用于select这种下拉框-->
<select ng-model="selectedCar" ng-options="y.brand for (x, y) in cars">
</select>
<h1>你选择的是: {{selectedCar.brand}}</h1>
<h2>模型: {{selectedCar.model}}</h2>
<h3>颜色: {{selectedCar.color}}</h3>
<p>下拉列表中的选项也可以是对象的属性。</p>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.cars = {
car01 : {brand : "Ford", model : "Mustang", color : "red"},
car02 : {brand : "Fiat", model : "500", color : "white"},
car03 : {brand : "Volvo", model : "XC90", color : "black"}
}
});
</script>
当然用ng-repeat也可以实现下拉框。
<select ng-model="selectedSite">
<option ng-repeat="x in sites" value="{{x.site}}">{{x.site}}</option>
</select>
ng-model 指令
利用ng-model指令不仅可以双向绑定控件到AngularJS应用程序的变量,还可以用来验证数据有效性
<form ng-app="" name="myForm">
Email:
<input type="email" name="myAddress" ng-model="text">
<span ng-show="myForm.myAddress.$error.email">不是一个合法的邮箱地址</span>
</form>
提示信息会在 ng-show 属性返回 true 的情况下显示。
ng-model 指令可以为应用数据提供状态值(invalid, dirty, touched, error,pristine):
<form ng-app="" name="myForm" ng-init="myText = 'test@qq.com'">
Email:
<input type="email" name="myAddress" ng-model="myText" required>
<p>编辑邮箱地址,查看状态的改变。</p>
<h1>状态</h1>
<p>Valid: {{myForm.myAddress.$valid}} (如果输入的值是合法的则为 true)。</p>
<p>Dirty: {{myForm.myAddress.$dirty}} (如果值改变则为 true)。</p>
<p>Pristine: {{myForm.myAddress.$pristine }} (如果值未改变则为 true)。</p>
<p>Touched: {{myForm.myAddress.$touched}} (如果通过触屏点击则为 true)。</p>
</form>
ng-model 指令基于它们的状态为 HTML 元素提供了 CSS 类:
input.ng-invalid {
background-color: lightblue;
}
- ng-empty
- ng-not-empty
- ng-touched
- ng-untouched
- ng-valid
- ng-invalid
- ng-dirty
- ng-pending
- ng-pristine
字面意思相信已经足够理解了,这就用来根据输入框的各种状况来显现相应的样式。
自定义指令
<body ng-app="myApp">
<ng-My-Directive1></ng-My-Directive1>
<div ng-My-Directive2></div>
<div class="ng-My-Directive3"></div>
<!-- directive: ng-My-Directive4 --> <script>
var app = angular.module("myApp", []);
app.directive("ngMyDirective1", function() {
return {
restrict : "E",
template : "<h1>用元素来调用的的指令!</h1>"
};
});
app.directive("ngMyDirective2", function() {
return {
restrict : "A",
template : "<h1>用属性来调用的的指令!</h1>"
};
});
app.directive("ngMyDirective3", function() {
return {
restrict : "C",
template : "<h1>用类名来调用的的指令!</h1>"
};
});
app.directive("ngMyDirective4", function() {
return {
restrict : "M",
replace : true,//必须加这行代码,否则注释还是注释
template : "<h1>用注释来调用的的指令!</h1>"
};
});
</script>
</body>
控制器与作用域
在之前我们看到了如何用控制器去控制AngularJS应用程序。
ng-controller 指令定义了应用程序控制器。
控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。
AngularJS 使用$scope 对象来调用控制器。
在 AngularJS 中, $scope 是一个应用象(属于应用变量和函数)。
控制器的 $scope (相当于作用域、控制范围)用来保存AngularJS Model(模型)的对象。
这个$scope就是作用域。
控制器还能有方法
<div ng-app="myApp" ng-controller="personCtrl">
姓名: {{fullName()}}
</div>
<script>
var app = angular.module('myApp', []);
app.controller('personCtrl', function($scope) {
$scope.fullName = function() {
return $scope.firstName + " " + $scope.lastName;
}
});
</script>
同时控制器的这些代码可以放在外部JS中,我看到这个点的时候,第一个想到的就是我以后自己弄个组件出来容易太多了。cool~~~
AngularJS 应用组成如下:
- View(视图), 即 HTML。
- Model(模型), 当前视图中可用的数据。
- Controller(控制器), 即 JavaScript 函数,可以添加或修改属性。
scope 是模型。
scope 是一个 JavaScript 对象,带有属性和方法,这些属性和方法可以在视图和控制器中使用。
一个控制器就相当于有一个scope ,那么如何去在多个控制器之间传递信息呢?
所有的应用都有一个根作用域 $rootScope,它可以作用在 ng-app 指令包含的所有 HTML 元素中。
$rootScope 可作用于整个应用中。是各个 controller 中 scope 的桥梁。用 rootscope 定义的值,可以在各个 controller 中使用
<div ng-app="myApp" >
<div ng-controller="myCtrl1">
<h1>我叫{{myName}}</h1>
<h1>我叫{{name}}</h1>
</div>
<div ng-controller="myCtrl2">
<h1>我叫{{name}}</h1>
</div>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl1', function($scope, $rootScope) {
$scope.myName="哈哈";
$rootScope.name = "Troy123";
});
app.controller('myCtrl2', function($scope, $rootScope) {
});
</script>
服务Service
在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用。
AngularJS 内建了30 多个服务。
之前看到的$scope和$rootScope都是服务。
var app = angular.module('myApp', []);
app.controller('customersCtrl', function($scope, $location) {
myUrl = $location.absUrl();
});
这里的 $location 服务,可以返回当前页面的 URL 地址。
$http 是 AngularJS 应用中最常用的服务。服务向服务器发送请求,应用响应服务器传送过来的数据。
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {
$http.get("welcome.htm").then(function (response) {
$scope.myWelcome = response.data;
});
});
或者
var app = angular.module('myApp', []);
app.controller('customersCtrl', function($scope, $http) {
$http.get("http://www.runoob.com/try/angularjs/data/Customers_JSON.php")
.success(function(response) {$scope.names = response.records;});
});
$timeout 服务对应了 JS window.setTimeout 函数,$interval 服务对应了 JS window.setInterval 函数。
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $timeout,$interval) {
$scope.myHeader = "Hello World!";
$timeout(function () {
$scope.myHeader = "How are you today?";
}, 2000);
$scope.theTime = new Date().toLocaleTimeString();
$interval(function () {
$scope.theTime = new Date().toLocaleTimeString();
}, 1000);
});
自定义服务
var app = angular.module('myApp', []);
app.service('hexafy', function() {
this.myFunc = function (x) {
return x.toString(16);
}
});
app.controller('myCtrl', function($scope, hexafy) {
$scope.hex = hexafy.myFunc(255);
});
过滤器
这个可以理解为是一个语法糖。
三个一般的过滤器uppercase lowercase currency
<div ng-app="" ng-init="myName='Troy123';num=12.1">
<p>大写化名字为 {{myName| uppercase }}</p><!--结果为TROY123-->
<p>小写化为 {{myName| lowercase }}</p><!--结果为troy123-->
<p>金额化为 {{num| currency }}</p><!--结果为$12.10-->
</div>
两个特殊的过滤器 orderBy filter
<div ng-app="myApp" ng-controller="namesCtrl">
<p><input type="text" ng-model="myValue"></p>
<ul>
<li ng-repeat="x in names | filter:myValue | orderBy:'country'">
{{ (x.name | uppercase) + ', ' + x.country }}
</li>
<!--names的每个选项,首先得根据myValue进行筛选,包含输入框myValue的值的才能被列出来,然后要根据x的county的值进行排序-->
</ul>
</div>
自定义过滤器
还记得之前讲得服务吧,这里也可以在在自定义过滤器中,用自定义的服务
<ul>
<li ng-repeat="x in counts">{{x | myFormat}}</li>
</ul>
<p>过滤器使用服务将10进制转换为16进制。</p>
</div>
<script>
var app = angular.module('myApp', []);
app.service('myService', function() {
this.myFunc = function (x) {
return x.toString(16);
}
});
app.filter('myFormat',['myService', function(hexafy) {
return function(x) {
return hexafy.myFunc(x);
};
}]);
app.controller('myCtrl', function($scope) {
$scope.counts = [255, 251, 200];
});
</script>
【AngularJS学习笔记】01 指令、服务和过滤器的更多相关文章
- AngularJs学习笔记5——自定义服务
前面整理了AngularJs双向数据绑定和自定义指令的相关内容,从手册上看也知道,ng部分还包括过滤器和函数,以及服务等. 过滤器:filter,就是对数据进行格式化,注意管道格式,例如: {{表达式 ...
- AngularJS 学习笔记--01
学习 AngularJS 要先了解 MVC 模式 , 即 " 模型--视图--控制器 " . 模型: 包含了需要用到的数据 ; 有两种广义上的模型 : 视图模型 , 只表示从控制器 ...
- angularjs学习笔记—事件指令
ngClick 适用标签:所有触发条件:单击 #html <div ng-controller="LearnCtrl"> <div ng-click=" ...
- SpringMVC学习笔记:拦截器和过滤器
首先说明一下二者的区别: 1. 拦截器基于java的反射机制,而过滤器是基于函数回调 2. 拦截器不依赖于servlet容器,过滤器依赖servlet容器 3. 拦截器只能对action请求起作用,而 ...
- AngularJs学习笔记--Forms
原版地址:http://code.angularjs.org/1.0.2/docs/guide/forms 控件(input.select.textarea)是用户输入数据的一种方式.Form(表单) ...
- AngularJs学习笔记--expression
原版地址:http://code.angularjs.org/1.0.2/docs/guide/expression 表达式(Expressions)是类Javascript的代码片段,通常放置在绑定 ...
- AngularJs学习笔记--directive
原版地址:http://code.angularjs.org/1.0.2/docs/guide/directive Directive是教HTML玩一些新把戏的途径.在DOM编译期间,directiv ...
- AngularJs学习笔记--html compiler
原文再续,书接上回...依旧参考http://code.angularjs.org/1.0.2/docs/guide/compiler 一.总括 Angular的HTML compiler允许开发者自 ...
- AngularJs学习笔记--concepts(概念)
原版地址:http://code.angularjs.org/1.0.2/docs/guide/concepts 继续.. 一.总括 本文主要是angular组件(components)的概览,并说明 ...
- AngularJS学习笔记2——AngularJS的初始化
本文主要介绍AngularJS的自动初始化以及在必要的适合如何手动初始化. Angular <script> Tag 下面通过一小段代码来介绍推荐的自动初始化过程: <!doctyp ...
随机推荐
- OpenCV 2.4.8组件结构全解析
转自: http://blog.csdn.net/huang9012/article/details/21811271 之前啃了不少OpenCV的官方文档,发现如果了解了一些OpenCV整体的模块架构 ...
- iOS杂谈-我为什么不用Interface builder
在互联网上关于Interface Builder的争吵每天都在发生,用和不用大家都有一大堆的理由.最近看了这篇文章,很多地方和作者有共鸣,结合自己的一些经历,就有了你现在所看到的东西,你可以把它当成前 ...
- 安装vs2013以后,链接数据库总是报内存损坏,无法写入的错误
安装vs2013以后,链接数据库总是报内存损坏,无法写入的错误 这个错误几个月以前解决过一次,但是到又碰到的时候,竟然完全忘记当时怎么解决的了, 看来上了年纪记忆真是越来越不行了... 解决方案很简单 ...
- C#下水晶报表打印自定义纸张
在VB6中,如果要自定义纸张很方便: Rpt.PaperSize = crPaperUser Rpt.SetUserPaperSize lZZG, lZZK 但在C#中却不行了,没有发现 SetU ...
- C8051 SMBus 原理
一.SMBus总线 SMBus串行I/O接口完全符合系统管理总线规范 1.1 版.它是一个双线的双向串行总线,与I2C串行总线兼容.系统控制器对总线的读写操作都是以字节为单位的,由SMBus接口自 ...
- C#、.NET网络请求总结(WebClient和WebRequest)
1.关于WebClient第三方的封装,支持多文件上传等 using System; using System.Collections.Generic; using System.Text; usin ...
- WebDriver基本API使用(基于Java)V1.0
WebDriver基本API使用(基于Java)V1.0http://www.docin.com/p-803032877.html
- SQL数据库对于保存特殊字符的解决办法
数据库的Char.Vachar类型可以兼容汉字,但特殊字符不行,在保存包含有特殊字符的字符串.正文时,会将特殊符号替换成一个”?”号. 例如: “基础教育课程手机报•特刊” == > “基础教育 ...
- Unity不同平台生成中预处理的注意点
http://blog.csdn.net/pandawuwyj/article/details/7959335 Unity3D的项目,这周吃亏在宏上了.大背景是项目需要在Unity中用Hudson自动 ...
- 将在本地创建的Git仓库push到Git@OSC
引用自:http://my.oschina.net/flan/blog/162189 在使用git 处理对android的修改的过程之中总结的.但不完善 Git push $ git push ori ...