1.MVC基本概念javascript
M:model,模型,數據。html
V:view,視圖,就是如何展現數據。html5
C:controller,控制器,數據與展現的聯繫(鏈接數據與視圖的橋樑),是主要的代碼邏輯區域。java
做用:使代碼分工明確,能夠根據不一樣的分塊進行單獨處理node
ng表明angular jquery
2.angular是什麼?webpack
*:ng是一個處理單頁面應用程序的框架,他擴展了原有的html,使用標籤模板指令等方法去實現動態的單頁面應用程序。web
*:單頁面應用程序:整個頁面站點,不管是什麼頁面內容都是一個html文件,在html文件的內部操做數據的顯示與變化,全部的數據改動再也不使用刷新的方法,而是利用ajax和dom操做在界面上進行調整ajax
*:ng不推薦在代碼中使用DOM操做,所以通常在ng項目中不多使用DOM操做算法
*:ng中徹底遵循MVC思想,將html當作是展現數據的view,而須要在界面中展現的數據就是modle
*: 在ng中,凡是一個ng-app就是一個模塊,能夠理解模塊是不少MVC結構的一個集合,模塊中有不少的對象,最典型的就是有不少的控制器,每一個控制器背後都有一個$scope做爲model的載體。
3.框架和庫
庫:是一堆按照功能分類的方法,對象數據的集合,目的就是將用戶開發的代碼簡化方便
框架:框架是一種結構,該結構規定了用戶該如何使用,按照這個結構編寫代碼
模塊:通常將具備一類功能的數據,方法,對象等組合到一塊兒,構成一個模塊
組件:模塊的功能化的結果,能夠獨立完成一個具體邏輯的所有內容的集合
4.
ng-app:ng今後處開始處理,這裏就是view
*:一個頁面中只能出現一個ng-app,若是出現多個的話,後面的都無效。。。
*:若是想要使用多個ng-app,須要使用angular.bootstrap方法
<body> <div id="qwert"> <input type="text" ng-model="inputData"><span>{{ inputData }}</span> </div> <div id="qqq"> <input type="text" ng-model="inputData"><span>{{ inputData }}</span> </div> </body> <script src="./js/angular.js"></script> <script > angular.module( 'mainApp1', [] ); angular.module( 'mainApp2', [] ); // bootstrap var div1 = document.getElementById( 'qwert' ); var div2 = document.getElementById( 'qqq' ); angular.bootstrap( div1, [ 'mainApp1' ] ); angular.bootstrap( div2, [ 'mainApp2' ] ); </script>
ng-model:數據
*:凡是須要處理的標籤數據,使用ng-model能夠實現數據的雙向綁定
*:雙向數據綁定,就是從界面中到model的變化,可是界面中數據操做發生了變化(用戶的行爲),背後的model中對應的數據一併改變,從背後到界面,凡是背後的model中的數據發生了變化,那麼界面中凡是使用了ng-model、ng-bind插值語法等數據的地方,值也跟着改變
*:若是須要手動的控制數據的變化,就必須首先建立一個模塊,該模塊對應於界面中的ng-app
ng-controller:該屬性會提供一個具體的函數,在函數中處理數據,維護每個具體的功能
5.angular語法
var module= angular.module('ng-app的名字',[]) //建立一個模塊 module.controller('控制器的名字',function($scope){//全部的操做都應該掛載到模塊中 //凡是在代碼中出現了ng-model之後,ng都會建立對應的數據模型 //ng會利用控制器做爲分割,會給每個控制器建立一個對象叫$scope,能夠控制數據 //在使用的時候,必須使用該名字不能修改
//在控制器中全部的model數據,實際上都是$scope的屬性,
$scope.inputData='angular';
})
6.小案例(數據雙向綁定)
<body ng-app='mainApp'> <div ng-controller='mainController'> <input type='text' ng-model='abc'> <span>{{abc}}</span> </div> </body> <script> angular.module('mainApp',[]) .controller('mainController',function($scope){ }); </script>
7.計算器小案例
<body ng-app="app" ng-controller="controller"> <input type="number" ng-model="num1"> + <input type="number" ng-model="num2"> = <!--<input type="text" ng-model="num1 + num2">--> <span>{{ num1 + num2 }}</span> </body> <script> angular.module( 'app', [] ) .controller( 'controller', function ( $scope ) { $scope.num1 = 0; $scope.num2 = 0; }); </script>
8.生成可自動排序的表格
<body ng-app="mainApp"> <div ng-controller="mainController"> <!-- 建立 表格 --> <!-- ng-repeat 語法 ng-repeat=" item in 數組 " 將該 "屬性" 放在標籤中, 那麼這個標籤就會根據 "數組" 中 的數據重複顯示 --> <!--<div ng-repeat="o in [ 1, 2, 3, 4 ]">{{ o }}</div>--> <!-- ng-click 與 onclick 相似, 不一樣的是ng-click 中的函數會默認的綁定在 $scope 中 語法: ng-click=" btn() " 此時的 btn 是 $scope 的一個屬性 --> <table border="1" width="400"> <thead> <tr> <!-- 點以前 key 中沒有數據 帶你以後 key 中有字符串 若是重複點 代表 key 中的數據 與 當前須要賦值的數據值同樣 --> <!--<th ng-click="key= key == 'name' ? '-name' : key=='-name' ? 'name' : '-name'">name</th>--> <th ng-click="key='name'">name</th> <th ng-click="key='age'">age</th> <th ng-click="key='gender'">gender</th> </tr> </thead> <tbody> <tr ng-repeat="item in data | orderBy: key"> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <td>{{ item.gender }}</td> </tr> </tbody> </table> </div> </body> <script> angular.module( 'mainApp', [] ) .controller( 'mainController', function ( $scope ) { $scope.data = [ { name: 'jim1', age: 29, gender: '女' }, { name: 'jim2', age: 19, gender: '男' }, { name: 'jim3', age: 49, gender: '女' }, { name: 'jim4', age: 39, gender: '男' }, { name: 'jim5', age: 9, gender: '女' } ]; }); </script> </html>
9.定義與獲取模塊
*:容許用戶本身定義多個模塊,而後將這個模塊與頁面中的ng-app結合
*:angular.module這個方法還能夠用來火的已經定義的模塊,凡是定義的數據都會存儲在angular這個對象的內部,使用該方法,能夠在內部查詢已經建立好的模塊,若是沒有找到該模塊,那麼報錯,若是找到了該模塊,則返回該模塊,便可以直接用於建立控制器等其餘內容。
*:模塊的獲取不受到閉包的影響
<body ng-app="mainApp"> <div ng-controller="mainController"> <input type="text" ng-model="inputData"><br> <input type="text" ng-model="inputData"><br> </div> </body> <script> (function () { angular.module( 'myApp', [] ) // 定義模塊, 在建文件夾 .controller( 'mainController', function ( $scope ) { $scope.inputData = '哈哈哈哈'; }); })(); (function () { angular.module( 'mainApp', [ 'myApp' ] ); // 主模塊依賴於 'myApp' // 因爲定義的全部數據都是 在 angular 上定義的, 所以全部的數據都存儲在 angular // 這個對象的 內部, 也就是在內部存儲着 // 若是提供一個模塊的名字, 那麼在內部就會查找對應的名字, 並實現加載 })(); </script>
10.項目構建工具
gulp、grunt、webpack
使用yeoman和generator-angular模板搭建ng項目:
1>安裝yo
npm install -g yo
2>安裝模板
npm install -g generator-angular
3>下載模板
11.控制器
在傳統的MVC框架中,控制器是ianxiview和model的橋樑,通常書寫代碼在控制器中,唉控制器中調用使用視圖與數據模型,在ng中弱化了控制器的功能,在MVC思想中的兩個基本問題:
1>數據如何同步($scope.$applay是實現數據雙向綁定的原理)
2>業務邏輯如何實現
在ng中控制器的功能實際上表現出來的只有模塊功能的管理做用
12.MVVM
由於減小了控制器的做用,可是引入了一個新的對象,這個對象與界面中的數據一一對應,而且支持數據的雙向綁定,這樣的一個對象與model仍是有必定的區別,這個對象成爲viewmodel,基礎視圖的數據模型,所以就弱化了controller的概念,可是強化了viewmodel的功能,所以有人稱ng是mvvm框架。
13.如何讓建立控制器?
語法:
module.controller('控制器的名字',function($scope){ })
//在內部執行的時候,會將第二個參數轉換成數組的形式
//在代碼的運行內部利用參數能夠得到函數體,將其tostring後能夠得到參數列表,再將其拼接成數組
完整寫法:
module.controller('控制器的名字',['$scope',function($scope){ }])
14.依賴注入:
依賴:就是在實現某些功能的時候,須要某些特定的對象
注入:就是須要某個對象的時候做爲參數傳入
依賴注入:在使用某個對象的時候,利用參數參入
除了$scope外,還有$http、$interval、$window、$rootScope...........
小案例:
<body ng-app="mainApp"ng-controller="mainController"> <input type="text" ng-model="name"> <input type="button" value="得到電影信息" ng-click="btn()"> <div> <div class="box" ng-repeat="item in list"> <div>{{item.title}}</div> <img ng-src="{{item.images.large}}" alt=""> </div> </div> </body> <script src="./js/angular.js"></script> <script> angular.module( 'mainApp', [] ) .controller( 'mainController', function ( $http, $scope ) { $scope.btn = function () { if ( $scope.name == null ) return; var txtSearch = 'https://api.douban.com/v2/movie/search?q=' + $scope.name; console.log( 'start' ); $http.get( txtSearch ) .success( function ( data ) { // 在利用 get 請求數據的時候, 若是成功了, 就會調用該方法 // 得到的數據在參數中 // console.log( data ); $scope.list = data.subjects; }); } }); </script>
15.依賴注入的本質:
1>ng在運行的時候,給在內部建立不少對象
2>這些對象都是私有的
// 爲何依賴注入的時候, 須要傳入是是一個字符串的名字?
// 傳入的是一個名字, 那麼在算法的內部
// 就會經過這個名字, 找到內部建立的對象
// 在函數調用的時候( 控制器 ), 將這個同名的 內部建立的 對象 傳入函數
// 若是傳入的名字, 內部沒有建立, 就會檢查其餘模塊中是否認義了
// 若是有定義, 同樣拿過來用
// 若是都沒有就會報一個錯誤
// XXXXProvider 的錯誤
module.controller( '名字', function ( $scope, $http ) {
});
// => 轉換
module.controller( '名字', [ '$scope', '$http', function ( $scope, $http ) {
}] );
16.依賴注入的小案例:
<body ng-app="mainApp" ng-controller="mainController"> <input type="text" ng-model="num"> </body> <script src="./js/angular.js"></script> <script> // var num = 0; angular.module( 'mainApp', [] ) .value( 'obj', { num: 0 } ) // 自定義服務( 5 種方法 ) .controller( 'mainController', function ( $scope, $interval, obj ) { // console.log( $window === window ); // 這裏須要處理界面中 的數據 // 就必定要有 $scope // 我要一個計時器, 來自增一個數據 // 須要一個計時器, 在 ng 內部有一個 $interval 的對象( 就是 setInterval 的包裝 ) // 還須要有一個變量, 記錄數字 $interval(function () { // num++; obj.num++; $scope.num = obj.num; }, 1000); // setInterval(function () { // num++; // $scope.num = num; // $scope.$apply(); // 雙向數據綁定的原理 // }, 1000); }); </script>
17.在ng 中能夠被注入的對象有兩類,一類是provider,一類是服務
18.做用域(scope)
每一個controller上的數據都是綁定到scope上面的,不一樣的controller擁有不一樣的數據
做用域對象:(就是$scope)
-> 何時建立 $scope
在 ng 凡有 控制器就有 $scope 存在.
在 ng 中還有一個特色, 就是懶加載, 也就是說不管是什麼對象只有在使用的時候被建立.
-> 多個 $scope 之間的 關係是什麼
在 ng 中 控制器能夠分配做用域, 即凡是定義一個 控制器 就會建立 一個 $scope. 若是控制器有
嵌套( 在一個 控制器裏定義另外一個控制器 ), 那麼內控制器的 $scope 原型繼承自 外控制器的 $scope
對象 a 原型繼承自 對象 b, 就是說 a 可使用 b 中的方法, a 的 __proto__ 就是 b
Object.create( b ) -> a
在 原型繼承中 若是 父對象 與 子對象 同時具備同名的屬性會怎樣?
-> 在 原型繼承中 子對象能夠繼承訪問 父對象的全部成員
var base = { name: 'jim' };
var sub = Object.create( base );
console.log( sub.name );
-> 若是在原型繼承中 修改或設置 子對象的屬性, 至關於給當前對象增長了屬性.
sub.age = 19;
-> 若是修改或設置 子對象中 與 父對象同名的屬性, 實際上父對象不變, 而是給子對象增長了對應的屬性
sub.name = 'tom';
// 除非 sub.__proto__.name = 'tom'
根據屬性搜索原則, 在利用子對象訪問 name 屬性的時候, 只操做子對象, 與父對象無關.
須要具有一個能力, 看 html 標籤 繪製 scope 關係
<body ng-app="mainApp">
<div ng-controller="ControllerA"> <!-- $scope( modelA ) -->
外: modelA: <input type="text" ng-model="modelA">
<div ng-controller="ControllerB"> <!-- $scope( modelB ) -->
內: modelB: <input type="text" ng-model="modelB"><br>
內: modelA: <input type="text" ng-model="modelA">
<button ng-click="btn()">點擊訪問</button>
</div>
<div ng-controller="ControllerC">
另內: <input type="text" value="{{modelA}}">
</div>
</div>
</body>
<script src="./js/angular.js"></script>
<script> var scopeA; angular.module( 'mainApp', [] )
//controller是內嵌關係,可是建立的時候是平行的代碼 .controller( 'ControllerA', function ( $scope ) { // scopeA = $scope;
}) .controller( 'ControllerB', function ( $scope ) { // $scope.btn = function () { // console.log( $scope.modelA ); // console.log( $scope.__proto__ === scopeA ); // } ; $scope.modelA = ''; scopeA = $scope; }) .controller( 'ControllerC', function ( $scope ) { }) </script>
$rootscope
-> 爲何一開始的代碼中沒有寫 controller 也能夠雙向綁定????
在 ng 程序中, 一旦使用 了 ng-app 就代表該標籤與其子標籤被 ng 處理
實際上在背後, 凡有了 ng-app 的背後都會被建立一個 $rootScope 的對象
它就是全部的 $scope 的祖宗, 全部的 $scope 都是直接或間接繼承與 $rootScope 的
凡是沒有寫 ng-controller 的 ng-model 都是 $rootScope 的屬性
這個 $rootScope 是程序一開始被建立的, 所以不是使用 controller 來訪問
ng 的 module 有一個方法, 叫作 run(), 表示運行, 即 ng 程序一運行的時候就會
執行該方法.
語法:
module.run( [ '$rootscope', function ($rootscope ) { ... } ] )
<body ng-app="mainApp"> <input type="text" ng-model="rootModel"> <div ng-controller="mainController"> <input type="text" ng-model="mainModel"> <div>{{mainModel}}</div> </div> </body> <script src="./js/angular.js"></script> <script> angular.module( 'mainApp', [] ) .controller( 'mainController', function ( $scope ) { console.log( 'running controller: mainController' ); // window.scope = $scope; })//程序運行時就會首先執行run函數,(即便run函數在controller後面),多個run函數會按照順序執行 .run(function ( $http ) { console.log( $http ); }) .run(function ( $location ) { console.log( $location ); }) .run( [ '$rootScope', function ( $rootScope ) { console.log( 'running ng-app: rootScope' ); console.log( $rootScope ); // window.rootScope = $rootScope; }]) </script>
19.註冊小案例
<body ng-app="mainApp" ng-controller="mainController"> <!-- 只須要註冊用戶名和密碼 --> 請輸入用戶名: <input type="text" ng-model="userId"><br> 請輸入密碼: <input type="password" ng-model="pwd1"><br> 請確認密碼: <input type="password" ng-model="pwd2"><br> <input type="reset" value="取消"> <button ng-click="btn()">註冊</button> <div style="color: red;">{{errMsg}}</div> </body> <script src="./js/angular.js"></script> <script> function User( userId, pwd ) { this.userId = userId; this.pwd = pwd; } User.prototype.save = function () { // 將 this 存儲到 login 的 loacalStorage var list = JSON.parse( localStorage.getItem( 'userData' ) || '[]' ); // 第一次進來的時候 是一個 空 即 數組 list.push( this ); // 存儲 localStorage.setItem( 'userData', JSON.stringify( list ) ); } // 將查找的功能交服務器完成就是配置一個 url 地址: http://www.xxxx.com/xxxx.xxxx?userId=.... // 所以爲了模擬 服務器的操做, 該 User 需 要提供提供 getUserByUserId 的方法 User.getUserByUserId = function ( userId ) { // 取數據 var list = JSON.parse( localStorage.getItem( 'userData' ) || '[]' ); // 在數組 list 中找其中某一項是否爲 userId // ES5 擴展的 forEach 不能提早退出 var user; list.forEach(function ( v ) { if ( v.userId == userId ) { // 找到數據 user = v; } }); // 若是 user 中有數據 就表示找到了, 若是沒有數據就表示沒有找到 return user; }; User.isExist = function ( userId ) { return this.getUserByUserId( userId ) != null; }; // ... angular.module( 'mainApp', [] ) .controller( 'mainController', [ '$scope', function ( $scope ) { $scope.btn = function () { $scope.errMsg = ''; // 1, 驗證用戶是否輸入完整 var userId = $scope.userId, pwd1 = $scope.pwd1, pwd2 = $scope.pwd2; if ( !userId || userId.trim().length === 0 ) { $scope.errMsg = '請輸入完整信息'; return; } if ( !pwd1 || pwd1.trim().length === 0 ) { $scope.errMsg = '請輸入完整信息'; return; } if ( !pwd2 || pwd2.trim().length === 0 ) { $scope.errMsg = '請輸入完整信息'; return; } // 已經輸入了, 這裏能夠 所有 trim 一下 userId = userId.trim(); pwd1 = pwd1.trim(); pwd2 = pwd2.trim(); // 2, 驗證兩次密碼是否一致 if ( pwd1 != pwd2 ) { $scope.errMsg = '密碼輸入不一致, 請從新輸入'; return; } // 判斷用戶名是否存在, 若是存在了不容許註冊 if ( User.isExist( userId ) ) { $scope.errMsg = '該用戶名已存在, 請從新輸入'; return; } // 存儲 new User( userId, pwd1 ).save(); }; }]);
20.搭建本地http服務器
1> 在 node 官網下載 node 安裝包
下載 .msi 格式的須要雙擊安裝
若是下載 zip 格式的 能夠配置命令行手動安裝
2> 下一步下一步安裝
安裝完成之後, 驗證是否安裝成功使用
node -v
npm -v
3> 安裝成功後使用 安裝 hs 服務器軟件
npm install -g http-server
4> 使用 shift + 右鍵 菜單中能夠看到 在當前目錄下 打開命令行
5> 鍵入 hs -o 或 http-server -o 能夠打開服務,在 當前目錄下搭建 http 服務器, 並打開頁面
默認載入 index.html 文件
和 http-server 同樣, 有一個 服務軟件 browser-sync(瀏覽器同步)
21.$http基礎知識(數據的展現案例)
<body ng-app="mainApp"> <div ng-controller="mainController"> <table border="1" width="400"> <tr ng-repeat="item in list"> <td>{{item.name}}</td> <td>{{item.age}}</td> <td>{{item.gender}}</td> </tr> </table> </div> </body> <script src="./angular.js"></script> <script> angular.module( 'mainApp', [] ) .controller( 'mainController', [ '$scope', '$http', function ( $scope, $http ) { { // $http.get('') 使用 get 請求 // $http.post('') 使用 post 請求 // $http({ // url: ... // method: ... // }) // $http 會返回一個 Promise 對象 // 其有一個 then 方法 // 其接受兩個 參數, 分別是兩個函數 // 表明的意思是 若是請求成功調用第一個函數 // 若是請求失敗調用第二個函數 // 若是使用獲取 請求有兩個快捷方法 // success // catch // $http.get( './personData1.json' ) // .then( function ( data ) { // // success // console.log( 'success' ); // console.log( data ); // }, function ( err ) { // // error // console.log( 'err' ); // console.log( err ); // }); // 等價 // $http.get( './personData1.json' ) // .success(function ( data ) { // console.log( 'success' ); // console.log( data ); // }) // .catch(function ( err ) { // console.log( 'err' ); // console.log( err ); // }); } $http.get( './personData.json' ) .success(function ( data ) { $scope.list = data; }); }]); </script>
22.數據的刪除案例:
<body ng-app="mainApp"> <div ng-controller="mainController"> <table border="1" width="400"> <tr ng-repeat="item in list"> <td>{{$index}}</td> <td>{{item.name}}</td> <td>{{item.age}}</td> <td>{{item.gender}}</td> <td><a href="#" ng-click="remove( $index )">刪除</a></td> </tr> </table> </div> </body> <script src="./angular.js"></script> <script> angular.module( 'mainApp', [] ) .controller( 'mainController', [ '$scope', '$http', function ( $scope, $http ) { $scope.remove = function ( index ) { console.log( index ); // 利用 this.item 便可找到咱們的 數據, 而後利用 list 刪除這個數據 // 利用 $index 便可拿到其索引, 就能夠刪除 $scope.list.splice( index, 1 ); window.scope = $scope; // 對服務器發送請求處理, 等到結果 }; $http.get( './personData.json' ) .success(function ( data ) { $scope.list = data; }); }]); </script>
23.數據的增長案例
<body ng-app="mainApp"> <div ng-controller="mainController"> 姓名: <input type="text" ng-model="name"><br> 年齡: <input type="number" ng-model="age"><br> 性別: <input type="text" ng-model="gender"><br> <button ng-click="add()">添加</button> <hr> <input type="text" ng-model="search"> <hr> <table border="1" width="400"> <tr ng-repeat="item in list | filter: { name: search }"> <td>{{$index}}</td> <td>{{item.name}}</td> <td>{{item.age}}</td> <td>{{item.gender}}</td> <td><a href="#" ng-click="remove( $index )">刪除</a></td> </tr> </table> </div> </body> <script src="./angular.js"></script> <script> // function UserList( $http ) { // } angular.module( 'mainApp', [] ) .controller( 'mainController', [ '$scope', '$http', function ( $scope, $http ) { window.scope = $scope; $scope.add = function () { // 驗證輸入 $scope.list.push({ name: $scope.name, age: $scope.age, gender: $scope.gender }); // 清空 $scope.name = $scope.age = $scope.gender = undefined; } $scope.remove = function ( index ) { console.log( index ); // 利用 this.item 便可找到咱們的 數據, 而後利用 list 刪除這個數據 // 利用 $index 便可拿到其索引, 就能夠刪除 $scope.list.splice( index, 1 ); // 對服務器發送請求處理, 等到結果 }; $http.get( './personData.json' ) .success(function ( data ) { $scope.list = data; }); }]); </script>
24.事件
- 什麼是事件
通常涉及到事件的時候, 指的事件機制, 通俗的解釋是 當用戶執行某一個行爲的時候, 瀏覽器會自動的調用預先註冊好的函數.
與事件相關的名字有不少
1> 事件處理函數. 就是響應用戶的函數.
2> 事件( 作名詞講 ). 是指事件名. 注意是不包含 on 的名字.
3> 事件的註冊( 給 on... 賦值 )
... ...
瞭解
4> 事件監聽
瀏覽器會判斷在用戶發出某個行爲的時候, 是否註冊了對應的事件處理函數. 若是有就會發射事件.
5> 事件發射
調用內置的事件處理函數
a 標籤爲例, 點擊 a 標籤的時候會跳轉, 那麼這個跳轉就是默認的處理行爲
在默認的事件處理函數中會調用 on... 的事件處理函數( 用戶的事件處理函數 )
猜想, 默認的邏輯爲
function 默認() {
if ( onclick ) {
if ( onclick() === false ) return;
}
// 默認的邏輯
// 跳轉
location.href = ....
}
通俗的解釋
京東在買東西, 我看上了一個產品( angular權威指南 ), 可是價格很高.
點擊收藏: 提示你是否要降價提醒. 若是我選擇了降價提醒.
事件機制在實際開發中有一個設計模式與之對應
1> 觀察者模式
2> 代理模式
- 事件模型
若是說須要自定義事件, 那麼就須要本身實現
1> 事件的註冊
2> 事件的發射
3> 監聽通常使用內置事件進行監聽
例如頁面中有一個案例 btn
那麼須要提供函數
1> on 綁定事件
2> fire 發射事件
3> 監聽 onclick 賦值
做業
function MyControl( dom ) {
this.dom = ...dom...;
this.events = {};
// 監聽...
}
MyControl.prototype = {
on: function () {},
fire: function () {}
}
var triBtn = new MyControl( '#dv' );
triBtn.on( '...', function () ... )
- angular 中事件的使用
在 ng 中有兩個很是經常使用的事件
1> emit 從子控制器向父控制器方向傳播事件
2> broadcast 從父控制器向子控制器方向傳播事件
這兩個方法都是用來發射事件的, 註冊使用 $on( ... )
emit事件:
<body ng-app="mainApp"> <div ng-controller="mainController"> <input type="text" ng-model="myInput"> <div ng-controller="secondController"> <input type="text" ng-model="myInput"> <input type="button" value="點擊" ng-click="click()"> </div> </div> </body> <script src="./js/angular.js"></script> <script> angular.module( 'mainApp', [] ) .controller( 'mainController', function ( $scope ) { $scope.myInput = ''; // 在這裏監聽事件, 等待數據的來到 $scope.$on( 'bigbigEvent', function ( evt, args ) { // console.log( arguments ); $scope.myInput = args; }); }) .controller('secondController', function ( $scope ) { $scope.myInput = ''; $scope.click = function () { // 在這裏發射一個事件, 將數據傳遞出去 // console.log($scope.$emit); $scope.$emit( 'bigbigEvent', $scope.myInput ); }; }); </script>
brodcast事件:
<body ng-app="mainApp"> <div ng-controller="mainController"> <input type="text" ng-model="myInput"> <input type="button" value="點擊" ng-click="click()"> <div ng-controller="secondController"> <input type="text" ng-model="myInput"> </div> </div> </body> <script src="./js/angular.js"></script> <script> angular.module( 'mainApp', [] ) .controller( 'mainController', function ( $scope ) { $scope.myInput = ''; $scope.click = function () { // 父控制器, 須要廣播事件 // console.log($scope.$broadcast); $scope.$broadcast( 'smallsmallevent', $scope.myInput, 1, 2, 3, 4 ); }; }) .controller('secondController', function ( $scope ) { $scope.myInput = ''; // 子控制器 // 監聽廣播事件 $scope.$on( 'smallsmallevent', function ( evt, a,b,c,d,e ) { console.log( arguments ); }); }); </script>
兄弟控制器間傳遞信息:
<body ng-app="mainApp"> <div ng-controller="mainController"> <input type="text" ng-model="myInput"> <input type="button" value="點擊" ng-click="click()"> </div> <div ng-controller="secondController"> <input type="text" ng-model="myInput"> </div> </body> <script src="./js/angular.js"></script> <script> angular.module( 'mainApp', [] ) .run( function ( $rootScope ) { // 監聽 發佈過來的事件, 而後轉發對應的事件 $rootScope.$on( 'mainEvent', function ( evt, data ) { // 拿到數據之後, 直接一腳踢開 $rootScope.$broadcast( 'secondEvent', data ); }) }) .controller( 'mainController', function ( $scope ) { $scope.myInput = ''; $scope.click = function () { $scope.$emit( 'mainEvent', { data: $scope.myInput } ); }; }) .controller('secondController', function ( $scope ) { $scope.myInput = ''; $scope.$on( 'secondEvent', function ( evt, data ) { $scope.myInput = data.data; }); }); </script>
25.表達式
有數據與運算符鏈接的, 而且有值的式子就是表達式
123
n = 123
func()
- ng 中表達式
ng 中的表示式是一個類 javascript 代碼片斷.
它主要用在插值語法中( {{ }} ), 或指令中( ng-click="btn()" ). 主要用於計算值
或函數調用.
- ng 表達式與 js 表達式的異同
<div>{{ 1234 | currency }}</div> //將數字以貨幣形式展現
26.frameset(頁面分欄)
<frameset cols="30%, *"> <frame src="http://www.baidu.com"/> <frame src="http://www.itcast.cn" /> </frameset>
27.過濾器:
- 什麼是過濾器
所謂的過濾就是將一堆數據進行一個篩選, 找到你想要的數據.
在 ng 中, 所謂的過濾是指, 將一個數據( 單個數據, 或數組等 ) 用一個函數進行處理, 獲得一個具體的結果.
這個過程就是過濾. 通俗說, 就是 "洗一下". 再一種解釋比如 映射( map ).
- 做用
將 ng 中使用的數據, 按照必定的規則顯示出來
例如:
貨幣: 按照格式顯示貨幣
日期: 按照指定的格式顯示日期
<body ng-app="mainApp"> <div>{{ now | date: 'yy年MM月dd日 hh:mm:ss' }}</div> </body> <script src="./js/angular.js"></script> <script> angular.module( 'mainApp', [] ) .run( function ( $rootScope ) { $rootScope.now = new Date(); }) </script>
- 語法
- 表達式
{{ 數據 | 過濾器名: 參數 }}
所謂的過濾器名, 其實就是一個函數, 其中豎線表示的含義是 將前面的 "數據" 做爲參數傳入到 過濾器這個函數中.
那麼函數的 第一個參數就是 前面的數據. 可是爲了能夠控制函數的具體實現, 函數還能夠帶有其餘參數. 在 過濾器名
後面用 冒號 鏈接的 內容就是參數, 若是有多個參數, 例如兩個參數的時候, 使用語法
{{ 數據 | 過濾器 : 參數1 : 參數2 }}
- 自定義過濾器
使用語法
module.filter( '過濾器的名字', [ function () {
return function ( input ) { // 這個被 return 的函數就是過濾器函數
}
}] );
<body ng-app="mainApp"> <div>{{ 'ng-app' }}</div> <div>{{ 'ng-app' | tocamel }}</div> </body> <script src="./js/angular.js"></script> <script>
//非駝峯轉駝峯
angular.module( 'mainApp', [] ) .filter( 'tocamel', function () { var r = /-(\w)/g; return function ( input ) { return input.replace( r, function ( _, c ) { return c.toUpperCase(); }); } }); </script>
- 注入
### 內置經常使用過濾器
filter 過濾, 該過濾器使用在數組數據的後面, 用於過濾出子數組
filter 帶有三種參數形式
1> 單個數據, 凡是在數組中數據與之同樣的就被留下來
2> 對象, 用來過濾 對象數組
3> 帶有一個函數, 用來對當前元素進行判斷, 相似於 jquery 的 map 函數.
該函數就是在判斷當前元素是否須要被過濾出來
currency 表示貨幣, 意味着使用金錢的方式來現實. 沒有參數.
number 表示已小數點後 多少位 來現實數據. 使用的時候使用語法
{{ num | number: 3 }} // 保留小數點後 3 位
date 採用時間格式來現實
yyyy 年份, yy 沒有世紀時間的年份
MM 月
dd 日
hh 小時, HH 表示 24 小時制
mm 分鐘
ss 秒
.sss 毫秒
json 以 json 的格式顯示數據
lowercase 轉小寫
uppercase 轉大寫
limitTo 表示從數組的哪個位置開始, 到哪個位置截取
limitTo: 3 從 左開始, 截取 前 3 個數據
limitTo: -4 從 右開始, 截取 後 4 個數據
orderBy 排序
帶有三個參數
1> 表示按照什麼屬性排序, 帶有負號的時候降序, 默認試試升序.
2> 一個 boolean 值, 表示是否逆序
3> 一個函數, 表示比較規則. 使用比較規則排序
### 過濾器組合使用
數據 | 過濾器1 | 過濾器2 | 過濾器3
### 自定義過濾器
28.指令 directive
- 什麼是指令
指令 就是 命令的意思. 簡單的描述就是給一個指令( 命令 )給你, 那麼你就要作不少的事情.
在 ng 中, 指令是寫在一個標籤中的一個特殊的屬性, 例如 ng-XXX. 在 ng 中凡是寫了指令
的地方, 其實背後會有一連串的代碼被執行.
例如:
ng-controller, 背後會 建立 $scope 等數據
ng-app, 背後會建立 模塊, $rootScope 等數據
ng-repeat, 直接根據 數據 建立 html 標籤
ng-model, 背後就將數據加到 最近的 一個 $scope 中
ng-click, 背後就建立一個監聽 點擊的事件
... ...
### 內置指令
// 這裏的指令都是延遲, 或 須要 ng 執行獲得結果的指令
ng-href
ng-src
ng-class 用於設置 類樣式的屬性
傳統的語法是使用 class="..."
須要時常更改 class 中含有的 類樣式
正常狀況多是 class="navigator hide", 菜單被展開之後, 能夠變成 class="navigator"
ng-class 的語法是 須要一個對象
例如: ng-class="{ 鍵: 值, 鍵: 值, 鍵: 值 }"
此時 鍵名 就是 類樣式的名字
值是一個 boolean 值, 表示是否含有該類樣式
例如, 要實現
class="navigator hide"
能夠寫成
ng-class="{ navigator: true, hide: true }"
若是要寫成
class="navigator"
能夠是
ng-class="{ navigator: true, hide: false }"
ng-style 該屬性用於設置樣式, 其樣式的值按照 分號分割 羅列在 該屬性中
例如:
style="width: 200px; height: 100px; border: 1px solid red;"
ng-style 能夠跟一個對象, 其對象的鍵值對 就表示 樣式的名字與值
ng-cloak 給全部的 使用了 ng 指令 的 html 標籤加上一個 hide 類樣式, 就是設置其 display: none
ng-bind 就是插值語法的指令形式
<div>{{ num }}</div>
等價於
<div ng-bind="num"></div>
ng-app
ng-controller
ng-model
//boolean類型的指令
ng-selected
ng-readonly
ng-disabled
//具備流程控制的指令
ng-if //元素是否存在 ng-hide和ng-show有相似的功能
ng-switch //相似於switch-case語句
<div ng-init='num=4'>
<div ng-switch='num'> <div ng-switch-when='2'>222</div> <div ng-switch-when='3'>333</div> <div ng-switch-default>default</div> </div>
</div>
ng-view//就是一個容器,用於路由操做
ng-repeat// 注意: $index、 $even、$odd、 $first、 $last
ng-init
//事件指令(添加到scope上)
ng-click
ng-dbclick
ng-change
ng-select
ng-submit
ng 1.5.8 中有 64 個指令
自定義指令:
定義的語法:
//定義的語法: angular.module('mainApp',[]) .directive('itLogin',[function(){//要用駝峯命名法 return{//指令的配置 template:'<div class='login'>'+ '請輸入用戶名:<input type="text"><br>'+ '請輸入密碼:<input type="password"><br>'+ '<input type="button" value="登陸">'+ '</div>' }; }])
//自定義指令的使用:
<div it-login>
</div>
自定義指令的屬性:
restrict:string //設置指令的使用形式(EACM),能夠容許個人指令以標籤、屬性、class、註釋的形式給出
E:element
A:attribute
C:class
M:common
eg:<it-login></it-login>
priority:number //設置指令的優先級
triminal:boolean //中止優先級低於該指令級別的指令
template: string | function
templateUrl:'tmp.html' //設置模板的路徑
replace:boolean //設置將指令標籤替換成模板內容
scope:boolean | object //用於設置獨立的做用域
取值爲true表示繼承做用域
直接賦值一個對象,這個就是獨立的做用域(不參與集成的特例)
controller: string | ['$scope', function($scope){}] //設置事件的處理函數
require:string
link :function
compile:function
transclude: true (嵌入,轉換包含,轉置 ) //將使用指令時傳入標籤內數據站換到模板中
<body ng-app='mainApp'> <div it-login>哈哈哈哈</div> </body> <script> //定義的語法: angular.module('mainApp',[]) .directive('itLogin',[function(){ return{//指令的配置 transclude:true , template:'<div class="login" ng-transclude></div>'//結果就是模板中會顯示'哈哈哈' }; }]) </script>
29.路由
操做步驟:
1>下載angular.js和angular-route.js
2>在頁面中放置一個容器
<ng-view></ng-view>
3>在建立模塊的時候引入'ngRoute'
angular.module('mainApp',['ngRoute'])
4>在模塊中有一個方法config是在程序運行以前被執行的,該方法中能夠完成程序的預設值
在ng中config方法和run方法構成了程序運行紅的預備和運行的行爲
在config中配置路由信息,使用語法:
.config(['$routeProvider',function(){
$routeProvider
.when('/',{
template:''
})
.when('/',{
template:''
})
.otherwise({redirectTo:'/'})
}])
在路由中的參數,就是url中的#後面的內容(hash)
<body ng-app='mainApp'>
<a href="#/">首頁</a>
<a href="#/a">a頁</a>#/
<a href="#/b">b頁</a>
<a href="#/c">c頁</a>
<ng-view></ng-view>
</body> <script> angular.module('mainApp',['ngRoute']) .config(['$routeProvider',function($routeProvider){ $routeProvider .when('/',{ template:'<h1>主頁</h1>' }) .when('/a',{ template:'<h1>a頁</h1>' }) .when('/b',{ template:'<h1>b頁</h1>' }) .when('/c',{ template:'<h1>c頁</h1>' }) .otherwise({redirectTo:'/'}); }]) </script>
路由中的屬性:
1>templateUrl
2>template
3>controller:函數 | 字符串
30.
移除路由的url中的#
1>在config方法中,配置$locationProvider,啓用html5模式
(function(){ angular.module('mainApp') .config(['$locationProvider',function($locationProvider){ $locationProvider.html5Mode(true); }]) })()
2>修改根路徑爲當前頁面的路徑
<head> <base href='/main/'>//設置根路徑 </head>
3>修改全部的a標籤的href屬性
<body ng-app='mainApp'> <a href="">首頁</a> // /是根目錄,須要去掉 <a href="a">a頁</a>#/ <a href="b">b頁</a> <a href="c">c頁</a> <ng-view></ng-view> </body>
31.服務:提供一些特定功能的對象(在ng中,服務就是被注入的對象)
在ng中被定義用來使用的數據、對象、函數 就是服務
factory
語法:
module.factory('服務名',[function(){
return 服務的本體
}])
<body ng-app='mainApp'> <div ng-controller='mainController'></div> </body> <script> angular .module('mainApp.services',[]) .factory('myServer',['$http',function($http){ //return 能夠是數字 對象 函數 return 123;
//return function(str){console.log(str)};
//return $http; }]); angular.module('mainApp',['mainApp.services']) .controller('mainController',function($scope,myServer){ // myServer('hello angualr')
//myServer.get(url)
// .success(function(data){console.log(data)}) }) </script>
service
語法:
module.service('服務名',構造函數)
與
module.factory('服務名',function(){
return new 構造函數名()
})等價
constant:定義常量變量(不可變)//能夠定義在config以前
語法:
module.constant('服務名',值)
value:定義變量(可變的)
語法:
module.value('服務名',值)
provider
語法:
module.provider('服務名',{
$get:function(){//必須提供$get方法
return 服務本體
}
})
32.項目結構
yeoman工具
1>安裝yo工具
npm install -g -o
2>安裝angular 模板(gulp版本)
npm install -g generator-gulp-angualr
3>運行yo下載模板依賴
很據需求下載數據便可
npm install & bower install
簡單命令:
mkdir myapp //建立文件夾
33.angular內部算法原理
雙向數據綁定 $scope.applay()
髒值檢測