angularjs誕生於2009年,由Misko Hevery等人建立,後爲Google所收購。是一款優秀的前端JS框架。已經被用於Google的多款產品中。 angularjs有着諸多特性,最爲核心的是:MVVM、模塊化、自動化雙向數據綁定、語義化標籤、依賴注入等等。 目前AgularJS應用很是普遍國內比較大型的公司如阿里雲、騰訊都在使用。php
http://angularjs.org 文檔查看 http://docs.angularjs.cn/api 調試工具 batarang 主要功能: 查看做用域、輸出調試信息、性能監控 安裝:https://pan.baidu.com/s/1jGILtzgcss
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="../../org/angular.min.js"></script> </head> <body> <div ng-app="app" ng-controller="ctrl"> {{name}} <!--雙向數據綁定--> <input type="text" name="" id="" ng-model="name"> </div> <script> // 註冊模塊m var m = angular.module('app', []); //註冊控制器ctrl m.controller('ctrl', ['$scope', function($scope) { //$scope 視圖模型 $scope.name = '老周'; }]) </script> </body> </html>
<script>
// 模塊名 依賴的模塊
var m = angular.module('app', []);
// 規範依賴注入寫法-避免代碼壓縮後出問題
// m.controller('ctrl', ['$scope', function($scope) {
// $scope.name = '老周';
// }])
// a能夠隨便變,由於是按前面$scope注入的,由於字符串是不會被壓縮的
m.controller('ctrl', ['$scope', function(a) {
a.name = '周宇翔';
}])
</script>
原理:頁面會先解析css樣式,而後angular在進行處理。因此內容會被先隱藏,angular解析完以後纔會顯示 display:block。這個過程angular自動處理。html
樣式表中增長樣式 .ng-cloak前端
.ng-cloak{
display:none;
}
標籤上增長 ng-cloak屬性 和 ng-cloak的classjquery
<div ng-cloak class="ng-cloak">{{name}}</div>
當點擊submit提交的時候,提交的是value中的數據,仍然會有空格,可是$scope中的數據通過 trim處理以後,沒有空格了。
十7、ng-if、ng-show、ng-disable、ng-init實現網站註冊協議設置 016
- ng-show : 使用css display:none display:block 控制
- ng-if: 移除和添加dom節點的方式控制顯示隱藏
$evengit
<li ng-repeat="(k,v) in data">
重複數據出錯--track by $indexangularjs
$scope.data = ['qq','百度','qq']
<li ng-repeat="(k,v) in data track by $index">
ng-model-optionsweb
失去焦點更新:chrome
<input type="text" ng-model="data" ng-model-options="{updateOn:'blur'}"/> {{data}}
三秒後更新:json
<input type="text" ng-model="data" ng-model-options="{debounce:3000}"/> {{data}}
三秒後更新或失去焦點更新:
<input type="text" ng-model="title" ng-model-options="{updateOn:'default blur',debounce:{default:3000,blur:0}}"/> {{title}}
ng-class-odd ng-class-even
過濾器: 對數據進行二次處理
currency:金錢修飾符,四捨五入
<span>{{price|currency:'¥':1}}</span>
number: 數字處理,保留幾位小數點,四捨五入
<span>{{price|number:2}}</span>
lowercase:轉小寫
<p>{{city|lowercase}}</p>
uppercase:轉大寫
<p>{{name|uppercase}}</p>
limitTo: 截取幾個字符
<p>{{title|limitTo:3}}</p>
date: 日期過濾器
<p>{{time|date:'yy-MM-dd HH:mm:ss'}}</p>
orderBy:'排序字段':升降序 true/false
<div>{{data|orderBy:'id':true}}</div>
filter:過濾字符:是否徹底匹配
<!-- 不傳第二個參數,無論哪一個值含有3都算 -->
<div>{{data|filter:'3'}}</div>
<!-- 第二個參數true徹底匹配 -->
<div>{{data|filter:3:true}}</div>
$scope.orderBy = function(field) {
if (arguments.callee[field] == undefined) {
arguments.callee[field] = false;
}
arguments.callee[field] = !arguments.callee[field];
$scope.data = $filter('orderBy')($scope.data, field, arguments.callee[field]);
}
$scope.status = {
id: false,
title: false,
age: false
};
$scope.orderBy = function(field) {
$scope.status[field] = !$scope.status[field];
$scope.data = $filter('orderBy')($scope.data, field, $scope.status[field]);
}
監聽普通變量
新數據 舊數據
$scope.$watch('title', function(newData, oldData) {
$scope.error = $scope.title.length > 3 ? '標題長度不能超過三個' : '';
})
監聽對象:第三個參數true必須寫
$scope.data = {
title: ''
};
$scope.$watch('data', function(newData, oldData) {
$scope.error = newData.title.length > 3 ? '標題長度不能超過三個' : '';
}, true)
//排序顯示數據臨時變量
$scope.lists = $scope.data;
$scope.$watch('search', function(n, o) {
$scope.lists = $filter('filter')($scope.data, n);
})
/html
<td>{{u.phone|truncate:3}}</td>
/js
var m = angular.module('app', []);
m.filter('truncate', function() {
return function(str, len) {
return str.substr(0, 11 - len) + new String('*').repeat(3);
}
})
shiy
/html
<div zyx></div>
<zyx></zyx>
<div class="zyx"></div>
/js
var m = angular.module('app', []);
m.directive('zyx', [function() {
return {
restrict: 'AEC',//A attr-屬性 E-element 元素標籤 C-class 類名
template: 'angular學習'
}
}])
angular自有指令都是 ng-開頭的,那咱們自定義的指令也保持這種風格,但不要使用ng-,可使用如 zyx- jy-等。那麼在命名的時候須要使用駝峯命名法。代碼以下
/html
<zyx-show></zyx-show>
/js
var m = angular.module('app', []);
m.directive('zyxShow', [function() {
return {
restrict: 'E',//A attr-屬性 E-element 元素標籤 C-class 類名
template: 'angular學習'
}
}])
<body ng-app="app" ng-controller="ctrl">
<jy-show color="red">這裏是文字</jy-show>
<script>
var m = angular.module('app', []);
m.directive('jyShow', [function() {
return {
restrict: 'E',
template: function(elem, attr) { //elem是當前元素標籤的angular對象能夠引入jquery用$()包裹,而後用jquery中的方法,attr是屬性集合
// console.log(elem, attr);
//return 123; //返回什麼內容就是什麼;
// return $(elem).html();
return "<span style='color:" + attr.color + "'>" + $(elem).html() + "</span>"
}
}
}])
m.controller('ctrl', ['$scope', function($scope) {
$scope.name = '老周';
}])
</script>
</body>
var m = angular.module('app', []);
m.directive('jyShow', [function() {
return {
restrict: 'E',
template: '<span>這是模板內容</span>',
replace: true //true:將template中的內容替換指令所在位置,false嵌入指令內
}
}])
transclude/ng-transclude
<jy-cms>這裏是指令標籤內的內容</jy-cms>
<script>
var m = angular.module('app', []);
m.directive('jyCms', [function() {
return {
restrict: 'E',
template: '<div><p ng-transclude=""></p>今每天氣不錯</div>',
transclude: true //true時,會將標籤指令中的內容替換掉 ng-transclude所在標籤的位置
}
}])
m.controller('ctrl', ['$scope', function($scope) {
$scope.name = '老周';
}])
</script>
templateUrl
/view/jsCms.html
<div>
這裏是templateUrl指定的模板內容
</div>
/2.html
<jy-cms>這裏是指令標籤內的內容</jy-cms>
<script>
var m = angular.module('app', []);
m.directive('jyCms', [function() {
return {
restrict: 'E',
templateUrl: './view/jyCms.html', //想要正常打開,須要在localhost的方式訪問(啓動phpstudy),不能直接打開靜態文靜的方式引入
replace: true //使用replacetrue的前提是,templateUrl模板中的內容,必須包在一個塊標籤內
}
}])
m.controller('ctrl', ['$scope', function($scope) {
$scope.name = '老周';
}])
</script>
總結:用 = 能夠調用父級做用域中的變量。用&符能夠調用父級做用域中的方法。
詳見 041用法
// 原生方法會觸發angular的髒檢查機制,讓修改後的數據更新,不是綁定在$scope下的方法雖然數據已經被修改了,可是沒有觸發髒檢查機制,致使視圖沒有更新,想要更新視圖,須要單獨調用$scope.$apply() 觸發髒檢查機制更新視圖
$scope.change = function() {
$scope.name = '積雲教育';
}
$('#jq').click(function() {
$scope.name = 'jquery修改生效';
$scope.$apply();
就是對原生window對象的angular封裝,目的跟timeout等同樣,觸發視圖更新
帶有元素標籤的數據,標籤不能再頁面正常解析,都會自動轉實體。因此要想正常解析須要兩點
建立緩存倉庫
var store = $cacheFactory('store');
獲取建立的緩存倉庫
var obj = $cacheFactory.get('store');
銷燬緩存倉庫
store.destroy();
緩存數據
store.put('web', {
'title': '騰訊能視頻',
url: 'www.qq.com'
});
讀取緩存數據
store.get('web')
刪除緩存數據
// store.remove('web');//按名刪
// store.removeAll();//全刪
// store.destroy();//把緩存倉庫也刪掉
$http({
url: '1.php',
method: 'get'
}).then(function(res) {
$scope.data = res.data;
}).then(function(error) {
console.log(error)
})
在配置中加入 cache: true 那麼就會將上次請求回來的數據緩存,不會重複發請求。查看chrome瀏覽器的network能夠看到之請求了一次1.php
$http.get('1.php',{cache:true}).then(function(res) {
$scope.data = res.data;
}).then(function(error) {
console.log(error)
})
m.service('webService', ['$http', function($http) {
this.get = function() {
return $http.get('1.php', {
cache: true
}).then(function(res) {
return res.data;
})
}
}])
<div ui-view></div>
===js===
var m = angular.module('app', ['ui.router']);
m.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
//默認路由
$urlRouterProvider.otherwise('/index');
//定義路由規則
$stateProvider.state('default', {
url: '/index',
template: '<h1>laozhou</h1>'
})
}])
====html====
<a ui-sref="index">首頁</a>
<a ui-sref="home">家目錄</a>
<a href="#/list">列表頁</a>
<div ui-view>訪問不存在的路由時,顯示以下提示信息</div>
====js=====
var m = angular.module('app', ['ui.router']);
m.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
//默認路由
$urlRouterProvider.otherwise('/index');
//定義路由規則
$stateProvider
.state('default', {
url: '/index',
template: '<h1>首頁</h1>'
})
.state('home', {
url: '/home',
template: '<h1>家目錄</h1>'
})
.state('list', {
url: '/list',
template: '<h1>列表頁</h1>'
})
}])
.state('home', {
url: '/home',
templateUrl: './view/home.html'
})