[學習筆記]Angularjs 簡介-語言特性
Angularjs 簡介
Google年前力推的Angularjs,因為其設計模式及其他特有的特性,在台灣算是挺多人前仆後繼的往坑跳入,以目前來說,因為react及其他具有更高效能特性的frame work相繼出現,angular算是一個有點陌路的語言了。
不過其特有的特性及語言結構,還是值得往其中學習。
Javascript學習曲線:
在簡介之前,可以先瞧瞧這一張javascript的學習曲線圖
(來源http://nathanleclaire.com/blog/2014/01/04/5-smooth-angularjs-application-tips/)
jquery因為其CSS般的selector和方便的語法,在學習路上算是穩定成長的。
Node 將前端語言做為後端程式的方式,上手後會是飛快成長。
Angular在進入其factory及directive之後,就會像圖上所示,搞不清處為什麼或是怎麼了。
*因此入坑前請三思
AngularJS 框架介紹
以一個語言的特性來說,angular實在是一個挺完善的語言,主要顯著的特性如下:
CoC 慣例優先原則 (Convention Over Configuration)
MVC 架構關注點分離 (Model-View-Controller)
雙向資料綁定(Two Way Data-Binding) 特性
SPA 單頁面應用程式(單頁應用)(Single Page Application)
這些特性或一或二存在其他語言之中,但以挑選一個開發專案framework的角度,angular算是一個推薦的框架。
CoC 慣例優先原則 (Convention Over Configuration)
這個概念簡單來講就是用一些簡單的常規、慣例(convention)來取代繁雜的設定(configuration)。
目的就是要簡化開發者的工作,免除一些複雜的設定。
(http://sevensavants.blogspot.tw/2009/12/convention-over-configuration.html)
而angualr延伸現有的 HTML 架構,透過 宣告式語法 (Directives Syntax) 直接賦予 HTML 額外的能力
<div ng-app="myApp">
<div ng-controller="myController1">
div>
div>
MVC 架構關注點分離 (Model-View-Controller)
Angualr在這邊厲害的地方,在於 控制器 (Controllers) 與 檢視 (Views) 之間切割的非常乾淨,再搭配 模組 (module) 與 相依性注入 (Dependency Injection) 相關實作,如 工廠 (factory) 與 服務 (service)、提供者 (provider) 與 常數值 (value)
讓整體運行的非常有計畫。
(http://www.angularjstutorials.net/angularjs_mvc.html)
雙向資料綁定(Two Way Data-Binding) 特性
AngularJS 所提供的 雙向資料繫結 (Two Way Data-Binding) 特性,view上的data和Controller之間收放得非常良好非常彈性Angular在呈現和資料中間,可以簡單建立雙向的數據綁定。
一旦建立雙向綁定,使用者輸入,會由Angular自動傳到一個變數中,再自動讀到所有綁到它的內容,更新它。效果上就是立即的資料同步。在程式碼中修改變數,也會直接反應到呈現的外觀上。
不僅內容可以雙向綁定,其他諸如類別、寬度、高度等等,都可以和變數與使用者的輸入,綁定起來。
(https://docs.angularjs.org/guide/databinding)
(http://www.codescratcher.com/angularjs/two-way-data-binding-angularjs/)
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js">script>
head>
<body>
<div ng-app="">
<div >
Enter Your Name :-
<input type="text" ng-model="name" placeholder="Enter Name" />
Expression Method 1 to display output:
<span>
{ { name } }
span>
Directive Method 2 as 'ng-bind' to display output:
<span ng-bind="name" />
div>
div>
body>
html>
SPA 單頁面應用程式(單頁應用)(Single Page Application)
AngularJS 裡,當瀏覽器將 HTML 與這些 AngularJS 自訂的語法解析成 DOM 物件之後,AngularJS 會直接將原生的 DOM 物件當作網頁片段的範本,然後直接以 DOM 物件 (原生的 JavaScript 物件) 進行操作,
SPA 優點
- 1、具有桌面應用的即時性、網站的可攜性和可訪問性。
- 2、使用者體驗好、快,內容的改變不需要重新載入整個頁面。
- 3、基於上面一點,SPA相對對伺服器壓力小。
- 4、良好的前後端分離。SPA和RESTful架構一起使用,後端不再負責範本渲染、輸出頁面工作,web前端和各種移動終端地位對等,後端API通用化。
- 5、對前端人員javascript技能要求更高,促使團隊技能提升。
缺點
- 1、傳統使用ajax取得回來的內容不利於SEO。
- 2、初次載入耗時相對增多。
- 3、上一頁下一頁功能不可用,如果一定要此功能需要自行實現。
- 4、對開發人員技能水準、開發成本高。
Angular 單頁面應用程式Single Page Application
這邊做一點angular SPA魔法的小展示
js/controller.js
//js/controller.js
var neux = angular.module('neux', ['ui.router']);
neux.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('edit', {
url: '/edit',
templateUrl: 'edit.html'
})
.state('home', {
url: '/home',
templateUrl: 'view.html'
});
});
neux.controller('neuxCtrl', function($scope,$state){
$scope.tags = [{
name: 'Neux',
link: "www.neux.com.tw/"
}, {
name: 'MikeNote',
link: "http://mike-zheng.github.io/"
}];
$scope.editTag = function() {
if (this.text) {
persons.push(this.person);
this.text='';
}
$state.go('home');
console.log("df");
};
});
index.html
<html ng-app="neux">
<head>
<meta charset="UTF-8">
<title>Neux - AngularJStitle>
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.min.js">script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.8/angular-ui-router.min.js">script>
<script src="js/controller.js">script>
head>
<body>
<div class="container" style="border:#ddd solid 2px;border-radius: 0.5em;" ng-controller="neuxCtrl">
<h1 style="text-align: center;">Neuxh1>
<nav>
<ul class="pager">
<li><a ui-sref="home">Homea>li>
<li><a ui-sref="edit">Edita>li>
ul>
nav>
<div class="well span4" style="margin-top:20px; width: 90%;">
<div ui-view>div>
div>
div>
body>
html>
edit.html
<form name="personForm" ng-submit="editTag()" >
<ul>
<li ng-repeat="tag in tags">
<label>tag: {{ tag.name }}label>
<input type="text" ng-model="tag.name" />
<label>link: {{ tag.link }}label>
<input type="text" ng-model="tag.link" />
li>
ul>
<input type="submit" value="submit" />
form>
view.html
<ul>
<li ng-repeat="tag in tags"><h4>{{ tag.name }}h4> {{ tag.link }}li>
ul>
在這邊使用了angular ui-view
的效果呈現(為延伸的ng-view),其中 ui.router
裡的 $stateProvider
協助整個spa做路由。
透過單頁應用的效果呈現,可以得知angular實在為一個不可多得MVX架構框架。
今天僅僅為angular 的pattern做簡介,下一次再介紹裡面與效能相關 $digest
$watch
,及功能上的介紹。
參考資料
http://nathanleclaire.com/blog/2014/01/04/5-smooth-angularjs-application-tips/
http://sevensavants.blogspot.tw/2009/12/convention-over-configuration.html
http://www.angularjstutorials.net/angularjs_mvc.html
https://docs.angularjs.org/guide/databinding
http://www.codescratcher.com/angularjs/two-way-data-binding-angularjs/
http://abgne.tw/angularjs/angularjs-getting-stared/ngroute-ngview.html
http://blog.miniasp.com/post/2013/04/23/Front-end-Engineering-Fineart-An-Introduction-to-AngularJS.aspx