AngularJs笔记(看菜鸟教程整理的)

AngularJs学习笔记


基本定义:
1.ng-app = "" 定义了angularJs的使用范围;
2.ng-init = "变量 = 值;变量 = '值'" 初始化变量的值,有多个变量时,中间用分号隔开;
3.ng-model = "变量" 定义变量名;
4.ng-bind = "变量" 绑定变量名,获取该变量的数据。这里的变量就是第3条的变量名。
但是一般都用双重花括号来获取变量的值,比如:{{变量}};
5.ng-repeat 指令会重复一个 HTML 元素:(可以用于循环遍历数组)



eg:5

<div ng-app="" ng-init="names=['Jani','Hege','Kai']">
 <p>使用 ng-repeat 来循环数组</p>
 <ul>
<li ng-repeat="x in names">
 {{ x }}
</li>
 </ul>
</div>

AngularJs指令:是以ng作为前缀的HTML属性。
AngularJs表达式写在双大括号内{{expression}}。
AngularJs表达式把数据绑定到HTML,这与ng-bind 指令作用相同。
AngularJs将在表达式书写的位置"输出"数据。


AngularJS 表达式 与 JavaScript 表达式
类似于 JavaScript 表达式,AngularJS 表达式可以包含字母,操作符,变量。
与 JavaScript 表达式不同,AngularJS 表达式可以写在 HTML 中。
与 JavaScript 表达式不同,AngularJS 表达式不支持条件判断,循环及异常。
与 JavaScript 表达式不同,AngularJS 表达式支持过滤器。


注意:


ng-model是用于表单元素的,支持双向绑定。对普通元素无效; <input> 元素 <select> 元素(下拉列表)<textarea> 元素 <button> 元素  HTML5 增加了如下表单元素:<datalist><keygen><output>
ng-bind用于普通元素,不能用于表单元素,应用程序单向地渲染数据到元素;
当ng-bind和{{}}同时使用时,ng-bind绑定的值覆盖该元素的内容。


ng-model 指令基于它们的状态为 HTML 元素提供了 CSS 类:
ng-invalid:未通过验证的表单
ng-valid:布尔型属性,它指示表单是否通过验证。如果表单当前通过验证,他将为true
ng-dirty:布尔值属性,表示用户是否修改了表单。如果为 ture,表示有修改过;false 表示修没有修改过
ng-touched:布尔值属性,表示用户是否和控件进行过交互
ng-pristine:布尔值属性,表示用户是否修改了表单。如果为ture,表示没有修改过;false表示修改过




$rootscope设置的变量在所有controller里面都是可以直接用{{$root.变量名}}来显示的,当然也可以赋值给$scope.


$rootscope是根作用域,是整个应用程序(ng-app),$scope只作用于本个方法




js中split(),如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
String.split() 执行的操作与 Array.join 执行的操作是相反的。


"2:3:4:5".split(":") //将返回["2", "3", "4", "5"]
"|a|b|c".split("|") //将返回["", "a", "b", "c"]




AngularJS过滤器
currency 格式化数字为货币格式。 
{{ 250 | currency }}            // 结果:$250.00
{{ 250 | currency:"RMB ¥ " }}  // 结果:RMB ¥ 250.00
filter 从数组项中选择一个子集。
// 查找name为iphone的行
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | filter:{'name':'iphone'} }} 
lowercase 格式化字符串为小写。
orderBy 根据某个表达式排列数组。


 // 根id降序排
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | orderBy:'id':true }}


// 根据id升序排  默认升序false
{{ [{"age": 20,"id": 10,"name": "iphone"},
{"age": 12,"id": 11,"name": "sunm xing"},
{"age": 44,"id": 12,"name": "test abc"}
] | orderBy:'id' }}


uppercase 格式化字符串为大写。
date格式化
{{1490161945000 | date:"yyyy-MM-dd HH:mm:ss"}} // 2017-03-22 13:52:25
number 格式化(保留小数)
{{149016.1945000 | number:2}}
limitTo 截取
{{"1234567890" | limitTo :6}} // 从前面开始截取6位
{{"1234567890" | limitTo:-4}} // 从后面开始截取4位




Array.prototype.slice.call(arguments);




<div ng-app = "myApp" ng-controller = "myCtrl">
<span>{{myUrl}}<span>
</div>


<script>
angular.module("myApp",[]).controller('myCtrl',function($scope,$location){
$scope.myUrl = $location.absUrl();
});
</script>


 $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;
    });
});


AngularJS $timeout 服务对应了 JS window.setTimeout 函数。(Timer)


AngularJS $interval 服务对应了 JS window.setInterval 函数。(一直执行)


创建自定义服务
app.service('hexafy', function() {
    this.myFunc = function (x) {
        return x.toString(16);
    }
});
app.controller('myCtrl', function($scope, hexafy) {
    $scope.hex = hexafy.myFunc(255);
});


$watch:持续监听数据上的变化,更新界面,如:


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


   //监听lastName的变化,更新fullName
   $scope.$watch('lastName', function() {
      $scope.fullName = $scope.lastName + " " + $scope.firstName;
   });


   //监听firstName的变化,更新fullName
   $scope.$watch('firstName', function() {
      $scope.fullName = $scope.lastName + " " + $scope.firstName;
   });
});
</script>


如果通过$watch去监听某变量的变化,最后去更新一个fullName就太麻烦了,还倒不如使用函数的方式,如getFullName():
$scope.getFullName =function(){  return $scope.lastName + " " + $scope.firstName;}




$http.get('/someUrl', config).then(successCallback, errorCallback);
$http.post('/someUrl', data, config).then(successCallback, errorCallback);




使用 ng-options 创建选择框(使用了数组作为数据源)
在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如下实例:
<div ng-app="myApp" ng-controller="myCtrl">
 
<select ng-init="selectedName = names[0]" ng-model="selectedName" ng-options="x for x in names">
</select>
 
</div>
 
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.names = ["Google", "Runoob", "Taobao"];
});
</script>
这种是通过ng-repeat方式创建的下拉框
<select>
<option ng-repeat="x in names">{{x}}</option>
</select>




比较:
ng-repeat 指令是通过数组来循环 HTML 代码来创建下拉列表,但 ng-options 指令更适合创建下拉列表,它有以下优势:
使用 ng-options 的选项的一个对象, ng-repeat 是一个字符串。


使用了对象作为数据源:x 为键(key), y 为值(value):
<select ng-model="selectedSite" ng-options="x for (x, y) in sites">
</select>


<select ng-model="selectedCar" ng-options="y.brand for (x, y) in cars"></select>


表格
<table>
  <tr ng-repeat="x in names">
    <td>{{ x.Name }}</td>
    <td>{{ x.Country }}</td>
  </tr>
</table>


style{table tr:nth-child(odd){};} 表格中的奇数行
style{table tr:nth-child(even);} 表格中的偶数行


 $index:    <td>{{ $index + 1 }}</td>//表格显示序号
 
 <td ng-if="$odd" style="background-color:#f1f1f1">{{ x.Name }}</td>
 
 <tr ng-repeat="x in names" style="{{$even?'background-color: #f1f1f1':'background-color: #ff0000'}}">
 允许跨域请求
 header("Access-Control-Allow-Origin: *");
 
 ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性。
 
 ng-show 指令隐藏或显示一个 HTML 元素。ng-hide 指令用于隐藏或显示 HTML 元素。
 <p ng-show="true">我是可见的。</p> 


<p ng-show="false">我是不可见的。</p>


<div ng-app="" ng-init="hour=13">
 
<p ng-show="hour > 12">我是可见的。</p>   可以是布尔值的表达式
 
</div>




AngularJS事件


1.ng-click点击事件  所有的操作都是通过Controller来完成的
<div ng-app="myApp" ng-controller="myCtrl">


<button ng-click="count = count + 1">点我!</button>


<p>{{ count }}</p>  //类似ng-model是双向绑定的,类似监听者模式(响应式)


</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.count = 0;
});
</script>




AngularJS表单


HTML控件:input元素,select元素,button元素,textarea元素


input控件使用ng-model指令来实现数据绑定
<input type = "text" ng-model = "firstName">


通过以上代码应用有了一个firstName的属性。它通过ng-model指令来绑定到你的应用
firstName的属性可以在controller中使用:
var app = angular.module('myApp',[]);
app.controller($scope,function(){
$scope.firstName = "Tom";
});


也可以直接通过表达式来使用这个属性
<div ng-app="">
  <form>
    First Name: <input type="text" ng-model="firstname">
  </form>
  <h1>你输入的内容为: {{firstname}}</h1>
</div>


Checkbox(复选框),默认是false,未被选中
<form>
    Check to show a header:
    <input type="checkbox" ng-model="myVar">
</form>
 
<h1 ng-show="myVar">My Header</h1>




Radio(单选框)  myVar 的值可以是 dogs, tuts, 或 cars。


<body ng-app="">


<form>
  选择一个选项:
  <input type="radio" ng-model="myVar" value="dogs">Dogs
  <input type="radio" ng-model="myVar" value="tuts">Tutorials
  <input type="radio" ng-model="myVar" value="cars">Cars
</form>


<div ng-switch="myVar">
  <div ng-switch-when="dogs">
     <h1>Dogs</h1>
     <p>Welcome to a world of dogs.</p>
  </div>
  <div ng-switch-when="tuts">
     <h1>Tutorials</h1>
     <p>Learn from examples.</p>
  </div>
  <div ng-switch-when="cars">
     <h1>Cars</h1>
     <p>Read about cars.</p>
  </div>
</div>


<p>ng-switch 指令根据单选按钮的选择结果显示或隐藏 HTML 区域。</p>


</body>


select(下拉框)


<body ng-app="">


<form>
  选择一个选项:
  <select ng-model="myVar">
    <option value="">
    <option value="dogs">Dogs
    <option value="tuts">Tutorials
    <option value="cars">Cars
  </select>
</form>


<div ng-switch="myVar">
  <div ng-switch-when="dogs">
     <h1>Dogs</h1>
     <p>Welcome to a world of dogs.</p>
  </div>
  <div ng-switch-when="tuts">
     <h1>Tutorials</h1>
     <p>Learn from examples.</p>
  </div>
  <div ng-switch-when="cars">
     <h1>Cars</h1>
     <p>Read about cars.</p>
  </div>
</div>


<p>ng-switch 指令根据下拉菜单的选择结果显示或隐藏 HTML 区域。</p>


</body>




app.controller('formCtrl', function($scope) {
    $scope.master = {firstName: "John", lastName: "Doe"};
    $scope.reset = function() {
        $scope.user = angular.copy($scope.master);
    };
    $scope.reset();
});






输入验证  HTML 表单属性 novalidate 用于禁用浏览器默认的验证。
$dirty 表单有填写记录
$valid 字段内容合法的
$invalid 字段内容是非法的
$pristine 表单没有填写记录


<body>


<h2>验证实例</h2>


<form ng-app="myApp" ng-controller="validateCtrl" 
name="myForm" novalidate>


<p>用户名:<br>
<input type="text" name="user" ng-model="user" required>
<span style="color:red" ng-show="myForm.user.$dirty && myForm.user.$invalid">
<span ng-show="myForm.user.$error.required">用户名是必须的。</span>
</span>
</p>


<p>邮箱:<br>
<input type="email" name="email" ng-model="email" required>
<span style="color:red" ng-show="myForm.email.$dirty && myForm.email.$invalid">
<span ng-show="myForm.email.$error.required">邮箱是必须的。</span>
<span ng-show="myForm.email.$error.email">非法的邮箱地址。</span>
</span>
</p>


<p>
<input type="submit"
ng-disabled="myForm.user.$dirty && myForm.user.$invalid ||  
myForm.email.$dirty && myForm.email.$invalid">
</p>


</form>


<script>
var app = angular.module('myApp', []);
app.controller('validateCtrl', function($scope) {
    $scope.user = 'John Doe';
    $scope.email = '[email protected]';
});
</script>


</body>
 
 
AngularJS API
 
angular.lowercase() 转换字符串为小写
angular.uppercase() 转换字符串为大写
angular.isString() 判断给定的对象是否为字符串,如果是返回 true。
angular.isNumber() 判断给定的对象是否为数字,如果是返回 true。




使用 AngularJS, 你可以使用 ng-include 指令来包含 HTML 内容:


sites.htm 文件代码:
<table>
<tr ng-repeat="x in names">
<td>{{ x.Name }}</td>
<td>{{ x.Url }}</td>
</tr>
</table>


<div ng-app="myApp" ng-controller="sitesCtrl"> 
  <div ng-include="'sites.htm'"></div>
</div>
 
<script>
var app = angular.module('myApp', []);
app.controller('sitesCtrl', function($scope, $http) {
    $http.get("sites.php").then(function (response) {
        $scope.names = response.data.records;
    });
});
</script>






AngularJS 动画


<script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular-animate.min.js"></script>
还需在应用中使用模型 ngAnimate:
<body ng-app="ngAnimate">


<style>
.hh {
  transition: all linear 0.5s;
  background-color: lightblue;
  height: 100px;
  width: 100%;
  position: relative;
  top: 0;
  left: 0;
}


.ng-hide {
  height: 0;
  width: 0;
  background-color: transparent;
  top:-200px;
  left: 200px;
}


</style>
<script src="https://cdn.bootcss.com/angular.js/1.4.6/angular.min.js"></script>
<script src="https://cdn.bootcss.com/angular.js/1.4.6/angular-animate.min.js"></script>
</head>
<body ng-app="myApp">


<h1>隐藏 DIV: <input type="checkbox" ng-model="myCheck"></h1>


<div class = "hh" ng-hide="myCheck"></div>


<script>
var app = angular.module('myApp', ['ngAnimate']);
</script>


</body>




AngularJS 依赖注入
一句话 --- 没事你不要来找我,有事我会去找你。


1.一个对别人有依赖的东西,它想要单独测试,就需要在依赖项齐备的情况下进行。如果我们在运行时注入,就可以减少这种依赖
2.参数由定义方决定
3.与import还不完全一样


AngularJS 提供很好的依赖注入机制。以下5个核心组件用来作为依赖注入:
value
factory
service
provider
constant




1.Value 是一个简单的 javascript 对象,用于向控制器传递值(配置阶段):
// 定义一个模块
var mainApp = angular.module("mainApp", []);


// 创建 value 对象 "defaultInput" 并传递数据
mainApp.value("defaultInput", 5);
...


// 将 "defaultInput" 注入到控制器
mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
   $scope.number = defaultInput;
   
});




2.factory
factory 是一个函数用于返回值。在 service 和 controller 需要时创建。
通常我们使用 factory 函数来计算或返回值。
// 定义一个模块
var mainApp = angular.module("mainApp", []);


// 创建 factory "MathService" 用于两数的乘积 provides a method multiply to return multiplication of two numbers
mainApp.factory('MathService', function() {
   var factory = {};
   
   factory.multiply = function(a, b) {
      return a * b
   }
   return factory;
}); 


// 在 service 中注入 factory "MathService"
mainApp.service('CalcService', function(MathService){
   this.square = function(a) {
      return MathService.multiply(a,a);
   }
});
...




3.provider
AngularJS 中通过 provider 创建一个 service、factory等(配置阶段)。
Provider 中提供了一个 factory 方法 get(),它用于返回 value/service/factory。
// 定义一个模块
var mainApp = angular.module("mainApp", []);
...


// 使用 provider 创建 service 定义一个方法用于计算两数乘积
mainApp.config(function($provide) {
   $provide.provider('MathService', function() {
      this.$get = function() {
         var factory = {};  
         
         factory.multiply = function(a, b) {
            return a * b; 
         }
         return factory;
      };
   });
});


4.constant
constant(常量)用来在配置阶段传递数值,注意这个常量在配置阶段是不可用的。
mainApp.constant("configParam", "constant value");






练习:自定义directive(指令)
元素
<first/>
<second/>


angular.module('MyApp',[])
.directive('first',first)
.controller('Con',['$scope',func1]);


function first(){
  var directive = {
    restrict:'ACE',
    template:'this is the it-first directive',
  };
  return directive;
};


fucntion func1($scope){
  $scope.name = 'alice';
}


等价于 :
 angular.module('myApp',[]).directive('first',[function(){
  return {
    restrict:'AE',
    template:'second directive',
    link:function(){
      console.log("this is a link");
    },
    controller:function($scope,$element,$attrs){
      console.log("this is a con");
    }
  };
 }]).controller('Con1',['$scope',function($scope){
  $scope.name = "alicehhh";
 }]);




 

猜你喜欢

转载自blog.csdn.net/silence_sep/article/details/77944110