擁抱AngularJS
文中一些地方AngularJS簡稱ng
簡介:
ng誕生于2009年,由Misko Hevery等創建,后被Google收購,為克服HTML在構建應用上的不足而設計。
是一款優秀的前端JS框架,核心特性:MVVM(Model-View-ViewModel)、模塊化、雙向數據綁定、依賴注入。
中文網: http://www.apjs.net/
入門:
書籍:
源碼:
API:
介紹:
模塊介紹:(v1.4.0)
- angular.js ng 核心
- angular-route.js ng 路由( 參考地址 )
- angular-animate.js ng 動畫( 參考地址 )
- angular-cookies.js ng Cookie( 參考地址 )
- angular-sanitize.js ng 安全模塊(應對XSS)
- angular-messages.js ng 表單驗證(參考地址)
- angular-resource.js ng restful數據交互(然并卵,只是封裝了一層$http,可以用來請求本地json文件)
- angular-mocks.js ng 單元測試工具類( 參考地址 )
- angular-loader.js ng 單元測試用(異常捕獲, 參考地址 )
- angular-scenario.js ng 單元測試用
- angular-touch.js ng gestoures(針對移動端,基于jQuery Mobile的touch事件。 不過貌似不太好用 )
- angular-aria.js ng 富互聯網應用(Accessible Rich Internet Applications,貌似沒啥用)
- angular-meesage-format.js ng 編譯相關(謹慎使用,該文件只有當 閉合編譯器 的高級選項標識時才會編譯)
控制器(controller):
簡單理解為- 通過依賴注入的方式,把service、依賴關系以及其他對象串聯到一起,然后通過$scope把它們關聯到view上。
var app = angular.module('app', []);
app.controller('indexCtrl', ['$scope', 'demoService', function($scope, demoService) {
$scope.name = demoService.getName();
}]) 路由控制:
var app = angular.module('app', ['ngRoute']);
app.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/list', {
templateUrl: 'module/order/list.html',
controller: 'listCtrl'
})
.when('/detail/:orderid', {
templateUrl: 'module/order/detail.html',
controller: 'detailCtrl'
})
.otherwise({redirectTo: '/dashboard'});
}]); 指令(directive):
簡單理解為-在特定DOM上運行的函數,指令可以擴展這個DOM的功能。
應用場景:封裝通用插件
var app = angular.module('app', []);
app.directive('tree', function($location) {
return {
restrict: 'EA',
replace: true,
scope: {
treeNodes: '='
},
templateUrl: './script/directive/template/treeTmpl.html',
link: function($scope, $element, $attrs) {
$scope.directTo = function(url) {
if(!!url) {
$location.path(url);
}
}
}
}
}) 參考資料:
服務(service):
簡單理解-單例對象
三種構建方式:
factory、service、provider
區分:
factory需要創建一個對象,并return這個對象。比較常用且容易理解。
var app = angular.module('app', []);
app.factory('demoService', function() {
var service = {
getName: function() {
var myName = 'Tom';
return myName;
}
};
return service;
}) service接收一個構造函數,不需要創建一個對象并return。跟factory的方式區別不大,源碼里只是加了層封裝。
var app = angular.module('app', []);
app.service('demoService', function() {
this.getName: function() {
var myName = 'Tom';
return myName;
}
}) provider是創建service 最底層的方法,需要在自帶的$get()方法里做邏輯。 跟上面兩個的區別在于:可以通過config()方法配置創建service 。
var app = angular.module('app', []);
app.provider('demoService', function() {
this.$get = function() {
var service = {
getName: function() {
var myName = 'Tom';
return myName;
}
}
return service;
}
}) provider應用場景:
- 當我們需要在應用開始前對service進行配置的時候,eg:我們需要配置services在不同的部署環境里(開發、測試、生產),使用不同的后端接口處理時。
- 當我們打算發布開源時。
參考資料: AngularJS中factory,service,provider的區別
過濾器(filter):
用于處理數據的格式化(format),eg:日期格式化、數字精度處理、字符串截取、對象排序等。
var app = angular.module('app', []);
app.filter('sortFilter', function() {
return function(type) {
if(type.toUpperCase() == 'ASC') {
return 'DESC';
} else {
return 'ASC';
}
}
})
參考資料: AngularJS filter詳解
其他資料:
何時應該使用Directive、Controller、Service?
實戰總結:
深入:
總結:
初識ng時,被它的依賴注入所迷惑,又被它的雙向數據綁定深深吸引,顛覆了以往用jQuery做項目時的思想。
僅記得做Java項目時,spring框架有一套依賴注入的模式。前端框架中引入依賴注入的思想,不得不佩服ng作者的腦洞。
后端出生的FE,難以抗拒地喜歡上了這個JS框架,雖然它被很多人質疑(學習成本高,太臃腫etc)。
相信會有更多的FE engineer愛上它。