摘要:當(dāng)左右服務(wù)都被解析并返回時(shí),會(huì)以服務(wù)為參數(shù)去調(diào)用組件的構(gòu)造函數(shù)。發(fā)送或廣播的消息應(yīng)該限定在最小的作用域。置頂一個(gè)通過,發(fā)送的消息列表并且窒息的管理以防止命名沖突在需要格式化數(shù)據(jù)時(shí),將格式
angular
數(shù)據(jù)雙向綁定的框架
提供數(shù)據(jù)綁定,DOM指令。angular,定義了一套規(guī)則,開發(fā)中就必須遵守規(guī)則,這套規(guī)則為項(xiàng)目提供了一套解決方案。
模塊,組件,模板,元數(shù)據(jù),數(shù)據(jù)綁定, 指令,服務(wù),依賴注入,控制器,過濾器,路由
基本概念 啟動(dòng)/引導(dǎo)啟動(dòng)/引導(dǎo) (Bootstrap)
作用:啟動(dòng)程序入口(bootstrap方法來引導(dǎo)Anuglar引用程序)
識(shí)別應(yīng)用程序中的根作用域$rootScope
通過依賴注入體系注冊服務(wù)的提供商
屬性型指令 (Attribute Directive)
是指令分類的一種。
作用:監(jiān)聽或修改其它HTML元素,屬性,組件的行為。一般作為HTML屬性。
例如: ng-controller 當(dāng)前所在的元素添加控制器。
組件(Component)
作用:把數(shù)據(jù)展示到視圖(view),并處理所有的視圖顯示和交互邏輯的Angular類。
在類中定義組件的應(yīng)用邏輯 ( 它被用來為視圖提供支持 ) , 組件通過一些由屬性和方法組成的 API 與視圖交互。
組件是Angular系統(tǒng)中最重要的基本構(gòu)造核心之一。
數(shù)據(jù)綁定數(shù)據(jù)綁定(Data Binding)
作用:將數(shù)據(jù)展示給用戶,用戶操作做出應(yīng)答。
將這些數(shù)據(jù)顯示到HTML中,添加事件監(jiān)聽器,獲取數(shù)據(jù)變化,更新數(shù)據(jù)。
在雙向數(shù)據(jù)綁定中,數(shù)據(jù)的屬性值會(huì)從具有屬性綁定的組件傳到輸入框。通過事件綁定,用戶的修改數(shù)據(jù)傳回到組件,把屬性值設(shè)置為最新的值。
Anuglar 在每一個(gè)JS事件周期中一次性處理所有的數(shù)據(jù)綁定,它會(huì)從組件樹的根部開始,用深度優(yōu)先的方式! (數(shù)據(jù)綁定在模板與對(duì)應(yīng)組件的交互中起到了重要作用)
組件從技術(shù)角度上看就是一個(gè)指令。組件位置很獨(dú)特,并在Angular中位于中心地位。
插值表達(dá)式
屬性綁定
事件綁定
attribute綁定
css類綁定
樣式綁定
基于ngModel的雙向數(shù)據(jù)綁定
單向綁定 (ng-bind) 和雙向綁定(ng-model)
ng-bind 單項(xiàng)數(shù)據(jù)綁定 ($scope -> view) 用于數(shù)據(jù)顯示,簡寫形式 {{}}
區(qū)別:頁面沒有加載完畢{{val}} 會(huì)直接顯示到頁面,知道Angular渲染該綁定數(shù)據(jù).
ng-bind則是在Angular渲染完畢后將數(shù)據(jù)顯示.
ng-model 雙向數(shù)據(jù)綁定 ($scope -> view and view -> $scope) ,用戶綁定值會(huì)變化的表單元素等.
每次綁定一個(gè)東西到 view 上時(shí) AngularJS 就會(huì)往 $watch 隊(duì)列里插入一條 $watch,用來檢測它監(jiān)視的 model 里是否有變化的東西。
當(dāng)瀏覽器接收到可以被 angular context 處理的事件時(shí),$digest 循環(huán)就會(huì)觸發(fā)。$digest 會(huì)遍歷所有的 $watch 。
一次更新數(shù)據(jù)操作,至少會(huì)觸發(fā)兩次$digest() 循環(huán),$gigest循環(huán)的次數(shù)達(dá)到了10次(超過10次后拋出一個(gè)異常,為了防止無限循環(huán))
依賴注入依賴注入(Dependency Injection)
需要依賴的原因:沒法控制這實(shí)例背后隱藏的依賴。 當(dāng)不能控制依賴時(shí),類就會(huì)變得難以測試。
按需注入,需要才注入。
通過給函數(shù)添加形參,使得caller傳入的參數(shù)的callee接收的參數(shù)邏輯分離,使得函數(shù)通過依賴管理系統(tǒng)僅僅需要聲明需呀的協(xié)作對(duì)象,而不需要知道從哪里來,如何創(chuàng)建等問題。
依賴注入即是設(shè)計(jì)模式,同時(shí)又是一種機(jī)制:當(dāng)應(yīng)用程序的一些組件需要另外一些組件的時(shí)候,使用依賴注入機(jī)制來創(chuàng)建被請(qǐng)求的部件并將其注入到發(fā)出請(qǐng)求的組件中。
提供類的新勢力的一種方式,負(fù)責(zé)處理好累所需的全部依賴。大多數(shù)依賴都是服務(wù)。Angualr使用依賴注入提供所需的組件以及組件所需的服務(wù)。
angular構(gòu)建應(yīng)用程序時(shí):定義許多精簡的小部件,每個(gè)小部件只做一件事,并且做好它,然后在運(yùn)行期把這寫精簡小部件裝配在一起組成應(yīng)用程序。
依賴注入的核心是:注入器(Injector),這個(gè)注入器根據(jù)需要返回被依賴的部件。injector.get(token) 方法返回與token(令牌)參數(shù)相關(guān)的依賴部件。
令牌是一個(gè)Angular中類型.絕大多數(shù)類方法都接受類名或字符串。Angular會(huì)把這些類名稱和字符串轉(zhuǎn)換成令牌。當(dāng)調(diào)用injector.get(Foo)時(shí),注入器返回用Foo類生成的令牌所對(duì)應(yīng)的依賴值,該依賴值通常是Foo 類的實(shí)例。
注入器(Injector)維護(hù)一個(gè)令牌與相應(yīng)依賴值的對(duì)照表(map)。如果注入器不能找到一個(gè)令牌對(duì)應(yīng)的依賴值,它就會(huì)使用提供商(Provider) 來創(chuàng)建一個(gè)依賴值.
提供商是創(chuàng)建依賴實(shí)例的“菜譜”之一,這個(gè)實(shí)例會(huì)與一個(gè)特定的令牌關(guān)聯(lián)起來。
只有當(dāng)注入器內(nèi)部的提供商注冊表中存在于令牌對(duì)應(yīng)的提供商時(shí),注入器才能為這個(gè)令牌創(chuàng)建一個(gè)依賴值。
angular會(huì)為每個(gè)注入器注冊很多angular內(nèi)建提供商。
通常注冊提供商的最佳時(shí)間是在應(yīng)用程序引導(dǎo)(Bootstrap)的時(shí)候。
指令依賴注入滲透在整個(gè)框架中,并且被到處使用。
注入器負(fù)責(zé)維護(hù)一個(gè) 容器 ,用于存放它創(chuàng)建過的服務(wù)實(shí)例。
注入器能使用 提供商 創(chuàng)建一個(gè)新的服務(wù)實(shí)例。
提供商 是一個(gè)用于創(chuàng)建服務(wù)的“配方”。
把 提供商 注冊到注入器。
指令(Directive)
指令是一個(gè)Angular類
作用:創(chuàng)建和重塑瀏覽器DOM中的HTML元素,負(fù)責(zé)與HTML元素的應(yīng)答系統(tǒng)
指令包括的類別:
組件(Component): 用來把程序邏輯和HTML模板組合起來,渲染出應(yīng)用程序的視圖。組件一般表示成HTML元素的形式,
屬性型指令:可以監(jiān)控和修改其它HTML元素,HTML屬性,DOM屬性,組件等行為。
結(jié)構(gòu)性指令:負(fù)責(zé)塑造HTML布局。一般是通過添加,刪除或操作HTML元素及其子元素來實(shí)現(xiàn)的。
注入器注入器(Injector)
Anuglar依賴注入系統(tǒng)中的一個(gè)對(duì)象。
作用:從緩存中找到一個(gè)"有名字的依賴"或者利用一個(gè)已注冊的提供商來創(chuàng)建依賴。
注入器是一個(gè)維護(hù)服務(wù)實(shí)例的容器,存放著以前創(chuàng)建的實(shí)例。
如果容器中還沒有所請(qǐng)求的服務(wù)實(shí)例,注入器就會(huì)創(chuàng)建一個(gè)服務(wù)實(shí)例,并且添加到容器中,然后把這個(gè)服務(wù)返回給Angular。
當(dāng)左右服務(wù)都被解析并返回時(shí),Angular會(huì)以服務(wù)為參數(shù)去調(diào)用組件的構(gòu)造函數(shù)。
插值表達(dá)式(Interolation)
屬性數(shù)據(jù)綁定的形式:位于雙大括號(hào)中的模板表達(dá)式會(huì)被渲染成文本。
模塊模塊(Module)
應(yīng)用程序通常由很多個(gè)模塊組裝而成。
模塊導(dǎo)出東西--類,函數(shù),值,供其它模塊引入。
把應(yīng)用寫成一組模塊,每個(gè)模塊只導(dǎo)出一樣?xùn)|西。
模塊:具有單一用途的內(nèi)聚代碼塊
一個(gè)模塊加載器來按需加載模塊并解析模塊的依賴關(guān)系。
模塊庫
有些模塊是其它模塊的庫
Anuglar 本身就是通過npm包發(fā)布的一組模塊庫, 以@angular為前綴。
每個(gè)庫包含一個(gè) 封裝桶 。是公開的外觀層(facade) 包括一些邏輯相關(guān)的私有模塊。
管道(Pipe)
管道是一個(gè)函數(shù)
作用:把輸入值換成輸出值供視圖顯示。
提供商(Provider)
作用:依賴注入系統(tǒng)依靠提供商來創(chuàng)建依賴實(shí)例。
它把一個(gè)供查閱用的令牌和代碼關(guān)聯(lián)到一起,以便創(chuàng)建依賴值。
服務(wù)是一個(gè)類,具體實(shí)現(xiàn)一件事情,具有專注,良好定義的用途。
幾乎任何東西都可以是一個(gè)服務(wù)。
添加,刪除或操作元素和其各級(jí)子元素來塑造或重塑HTML布局的指令。
例如:ngIf
模板模板(Template)
模板是大塊HTML。
作用:渲染視圖
Angular會(huì)在指令和組件的支持和持續(xù)指導(dǎo)下,渲染視圖。
裝飾器 (Decorator | Decoration)
裝飾器是一個(gè) 函數(shù),這個(gè)函數(shù)將元數(shù)據(jù)添加到類,類成員(屬性,方法)和函數(shù)上。
angular 使用自身一套裝飾器來實(shí)現(xiàn)應(yīng)用程序各個(gè)部分之間的相互操作。
基礎(chǔ)指令 ng-app應(yīng)用程序的指令,一個(gè)程序中必須要有該指令
ng-model
數(shù)據(jù)綁定的指令,將數(shù)據(jù)綁定到應(yīng)用程序中
ng-bind
綁定數(shù)據(jù),它的簡寫方式直接在元素中{{key}}
{{ msg }}
當(dāng)頁面加載完畢,angularjs啟動(dòng)起來,首先回去頁面中尋找ng-app指令,找到后初始化應(yīng)用程序。
ng-app告知angular這個(gè)應(yīng)用是綁定那個(gè)DOM元素,也就是程序初始化的元素時(shí)body,所以以后綁定的指令能夠生肖的只能在ng-app所在的元素中
angularjs找到ng-model指令,它將該指令對(duì)應(yīng)數(shù)據(jù)綁定在該程序的作用域中。
angularjs找到ng-bind或者{{key}} 指令,它將數(shù)據(jù)渲染到該元素內(nèi)。
angularjs遍歷其它指令,完畢后,就可以使用應(yīng)用程序。
表示初始化應(yīng)用程序中的變量,多個(gè)變量用; 注意定義多個(gè)變量不能用逗號(hào),只能用分號(hào);
module{{ info }} {{ msg }}
通過angular.module方法
該方法有兩個(gè)參數(shù)
參數(shù)1,表示程序的名稱。
參數(shù)2,表示依賴服務(wù)(依賴集合)
依賴就是達(dá)到某個(gè)目的的必要條件(不可或缺)。
var app = angular.module("app", []);controller控制器
定義控制器
App的controller方法:
兩個(gè)參數(shù)
第一個(gè)參數(shù)表示控制器的名稱
第二參數(shù)表示控制器的構(gòu)造函數(shù)
參數(shù)是你需要的數(shù)據(jù),需要什么可以傳遞什么,這樣在構(gòu)造函數(shù)中就可以使用它,如果沒有傳遞就無法使用
ng-controller 控制應(yīng)用程序的,后期對(duì)某一視圖動(dòng)態(tài)改變的作用
定義控制器
app.controller();
參數(shù)1:控制器名稱
參數(shù)2:控制器的回調(diào)函數(shù)(構(gòu)造函數(shù))
回調(diào)函數(shù)的參數(shù)是所需要的數(shù)據(jù),需要什么可以傳遞什么,這樣在回調(diào)函數(shù)中就可以使用它,如果沒有傳遞就無法使用
angular參數(shù)注入:想用什么東西就在參數(shù)中注入。
不要再控制器中操作 DOM。 通過指令完成。
通過控制器完成的功能命名控制器,并以字符串Ctrl結(jié)尾,例如:(HomePageCtrl)
控制器不應(yīng)該全局中定義
盡可能精簡控制器,將通用函數(shù)抽線為獨(dú)立的服務(wù)
通過方法引用進(jìn)行跨控制器通訊(通常是子控制器與父控制器通訊) 或者 $emit,$broaadcast 以及 $on 方法。發(fā)送或廣播的消息應(yīng)該限定在最小的作用域。
置頂一個(gè)通過 $emit,$boradcast 發(fā)送的消息列表并且窒息的管理以防止命名沖突
在需要格式化數(shù)據(jù)時(shí),將格式化邏輯封裝成 過濾器
// 控制器 app.controller("msg", function ( $scope ) { console.log( this ); console.log( arguments ); });控制器$scope
$scope: 用來實(shí)現(xiàn)數(shù)據(jù)與視圖的連接,在$scope上定義的數(shù)據(jù),可以用視圖在上,那么視圖上綁定的數(shù)據(jù)可以在$scope上也能獲取到
$scope 是通過原型式繼承實(shí)現(xiàn), 子作用域會(huì)繼承父作用域中的變量,但是可以為子作用域添加變量還重寫符作用域中的變量。
scope特點(diǎn)
$scope 是一個(gè) POJO 簡單的Java對(duì)象
$scope 提供了一些工具方法$watch()/$apply();
$scope 表達(dá)式執(zhí)行環(huán)境,或者說作用域
$scope 是一個(gè)樹型結(jié)構(gòu),與DOM標(biāo)簽平行
每一個(gè)angularjs應(yīng)用都有一個(gè)跟作用域$rootScope,位于ng-app上
$scope 可以傳播事件,類似DOM事件,可以向上下可以向下
$scope 不僅是MVC 的基礎(chǔ),也是后買呢實(shí)現(xiàn)雙向綁定的基礎(chǔ),應(yīng)用開始先找rootScope,然后把下級(jí)scope附加到rootScope上從而形成樹型結(jié)構(gòu).
scope生命周期
創(chuàng)建(creationd)
在創(chuàng)建控制器或指令時(shí),angularjs會(huì)用$onjector創(chuàng)建一個(gè)新的作用域,并在這個(gè)新建的控制器或指令時(shí)把作用域傳進(jìn)去
鏈接
scope對(duì)象會(huì)附加或鏈接到視圖。這些作用域?qū)?huì)注冊到 angular上下文中發(fā)生變化時(shí)需要運(yùn)行的函數(shù)
$watch -> 注冊監(jiān)控(Watcher registration) 變化時(shí)執(zhí)行 回調(diào)函數(shù)
更新
事件循環(huán)執(zhí)行時(shí),頂級(jí)的$rootScoep和每個(gè)子作用域都執(zhí)行自己的臟值檢查。某個(gè)監(jiān)控函數(shù)監(jiān)控變化,檢測到變化后,$scope會(huì)觸發(fā)指定的回調(diào)函數(shù)。
銷毀
當(dāng)scope在視圖中不再需要時(shí),會(huì)清晰和銷毀自己。
$scope.$destory();
ng-eventsName
例如:ng-click
如果想在回調(diào)函數(shù)中傳遞參數(shù),在圓括號(hào)里面直接添加
執(zhí)行的作用域是$scope,當(dāng)前的作用域
參數(shù)通過元素調(diào)用時(shí)傳遞的參數(shù)一致,最后一個(gè)參數(shù)為事件對(duì)象
// 事件 $scope.clickBtn = function ( msg, ev ) { }顯隱
ng-show 表示顯示元素指令
ng-show 顯示元素:true顯示,false隱藏
ng-hide 隱藏元素:true隱藏,false顯示
1 2表達(dá)式
插值和數(shù)據(jù)的過程中可以應(yīng)用表達(dá)式
的綁定過程我們可以應(yīng)用表達(dá)式
在表達(dá)式中不僅僅可以用運(yùn)算符,還可以應(yīng)用js提供的方法
過濾器{{"面積是:" + width * height}}{{ msg.toUpperCase() }}
用來對(duì)綁定數(shù)據(jù)顯示時(shí)候處理
{{key | filter}}
currency
格式化數(shù)字為貨幣格式
{{msg | json}}{{ msg | currency }}
filter
過濾數(shù)組項(xiàng)
{{ color | filter : "n" }}{{ color | filter : filterChar }}{{ color | filter : filterFirstStr }}
date
日期過濾器,格式化日期
{{ iDate | date : "yyyy" + "年"}} {{ iDate | date : "MM" + "月" }} {{ iDate | date : "dd" + "日" }} {{ iDate | date : "HH" + ":" + "mm" }}{{ iDate | date : "yyyy年 MM月dd日 HH:mm" }}
// app var app = angular.module("appBody", []); // controller app.controller("filters", function ( $scope ) { $scope.color = ["tan", "khaki", "Pink", "cyan"]; // a 過濾出來 $scope.filterChar = "a"; $scope.filterFirstStr = function ( val ) { // 匹配首字母大寫 return val[0] === val[0].toUpperCase(); } });
limitTo
截取過濾器
參數(shù)表示截取的長度
這個(gè)過濾器不僅僅可以截取字符串,還可以截取數(shù)組
{{ color | limitTo : 2 }}{{ msg | limitTo : 3 }}
字符串大小寫
uppercase 將字符串轉(zhuǎn)化成大寫
lowercase 將字符串轉(zhuǎn)化成小寫
這個(gè)過濾器痛對(duì)數(shù)據(jù)直接調(diào)用字符串方法toUpperCase和toLowerCase效果是一樣的
但是angular建議使用過濾器
過濾器可以被復(fù)用
不建議在表達(dá)式中使用方法(除特殊情況)
{{ msg | uppercase }}{{ msg | lowercase }}{{ msg.toLowerCase() }}
number過濾器
是一種數(shù)字類型數(shù)據(jù)過濾器
參數(shù)表示截取小數(shù)位置
該過濾器是將數(shù)字以每三為分割渲染的
不傳遞參數(shù)默認(rèn)保留三維,最后一位四舍五入
{{ num | number }}{{ num | number : 4 }}
orderBy
對(duì)數(shù)組進(jìn)行排序的過濾器
參數(shù)1,數(shù)組中每個(gè)成員排序的索引屬性名稱
參數(shù)2,正序還是倒序 (true反序)
自定義過濾器{{ color | orderBy : "" : true }}{{ color | orderBy }}
定義
通過app提供的filter方法來定義過濾器 app.filter();接受兩個(gè)參數(shù)
參數(shù)1,過濾器的名稱
參數(shù)2,過濾器的回調(diào)函數(shù)(構(gòu)造函數(shù))
回調(diào)函數(shù)必須返回一個(gè)函數(shù),這個(gè)函數(shù)在每次數(shù)據(jù)更新時(shí)候執(zhí)行。
回調(diào)函數(shù)只執(zhí)行一次
返回的函數(shù),可以接受過濾器使用時(shí)傳遞的參數(shù),但是第一個(gè)參數(shù)永遠(yuǎn)是綁定的數(shù)據(jù),后的參數(shù)才是傳遞的參數(shù),參數(shù)的順序痛使用時(shí)傳遞參數(shù)的順序一致。
調(diào)用
使用方式同內(nèi)置過濾器一樣,在管道符號(hào)后面添加過濾器的名稱,通過:添加參數(shù)
使用小駝峰命名
盡可能使過濾器精簡。 過濾器在 $digest loop 中頻繁被調(diào)用,過于復(fù)雜的運(yùn)算使得整個(gè)應(yīng)用執(zhí)行緩慢。
在過濾器中只做一件事. 更加復(fù)雜的操作可以用pipe來實(shí)現(xiàn).
{{ msg | CaseChar }}{{ msg | CaseChar : true }}
app.filter("CaseChar", function () { return function ( val, FirstToUpper ) { if ( val ) { // FirstToUpper 參數(shù) 表示第一個(gè)字母大寫 if ( FirstToUpper ) { // 第一個(gè)字母 大寫 val = val.replace(/^[a-z]/, function ( match, $1 ) { return match.toUpperCase(); }); } // 存在輸入的val 值 轉(zhuǎn)駝峰 return val.replace(/_([w])/g, function ( match, $1 ) { return $1.toUpperCase(); }); } return ""; } });表單驗(yàn)證
當(dāng)對(duì)表單元素form添加name屬性時(shí)候,angular會(huì)自動(dòng)將該屬性的值添加到作用域中,并且該屬性具有表單驗(yàn)證的屬性. 具有FormContorller對(duì)象
$dirty 表單是否被用戶輸入過,輸入過,值為true,沒有輸入過值為false
$pristine 表單是否被用戶輸入過,輸入過,值為false,沒有輸入過值為true
$valid 輸入的值是否合法,合法值為true,不合法為false
$invalid 輸入的值是否合法,合法值為false,不合法為true
$valid 屬性值為true時(shí),所有表單元素必須$valid都是true
$invalid 屬性為true時(shí),只要有一個(gè)表單元素$invalid之為true
$dirty 屬性為true時(shí),只要有一個(gè)表單元素被修改過,$dirty值為true
$pristine 屬性為true時(shí),所有的元素未被修改過,那么$pristine值為true
獲取app并執(zhí)行(程序入口指令會(huì)提供一個(gè)run方法),通常會(huì)在該方法中訪問根作用域,該方法接收一個(gè)函數(shù)作為參數(shù),
函數(shù)中的this指向window,因此可以訪問到全局作用域下的變量。
arugments默認(rèn)沒有值,需要什么值,需要通過參數(shù)注入來供函數(shù)內(nèi)使用。
作用:處理的是根作用域,因此通常要將$rootScope傳遞進(jìn)來.
app.run(function ( $rootScope ) { });
controller與作用域
var app = angular.module("main", []); app.controller("parentCtrl", function ( $scope ) { $scope.clickParent = function () { $scope.msg = "parentScope"; } }).controller("childCtrl", function ( $scope ) { $scope.clickChild = function () { $scope.msg = "childScope"; } }); // rootScope app.run(function ( $rootScope ) { $rootScope.msg = "rootScope"; }) console.log( app );ng指令
ng-disabled
表單是否可以操作
ng-readonly
表單是否是只讀
ng-checked
選擇框是否被選中
值為true:選中
值為false:未選擇
ng-change
監(jiān)聽輸入表單內(nèi)容的改變,當(dāng)表單內(nèi)容改變的時(shí)候就會(huì)觸發(fā).
改變的時(shí)候,需要知道數(shù)據(jù)是否更改,需要加上ng-model
app.controller("inp", function ( $scope ) { $scope.change = function () { alert($scope.msg); } });
ng-submit
對(duì)form表單元素綁定submit事件,當(dāng)點(diǎn)擊表單中submit元素時(shí)候,會(huì)觸發(fā)該事件
ng-submit需要搭配標(biāo)簽form使用
ng-src
瀏覽器打開頁面,瀏覽器不認(rèn)識(shí)ng-src屬性,所就不會(huì)發(fā)請(qǐng)求,那么當(dāng)ng-src綁定的數(shù)據(jù)imgSrc有數(shù)據(jù)的時(shí)候,angular會(huì)把這個(gè)數(shù)據(jù)賦值給src屬性,讓img標(biāo)簽發(fā)送一個(gè)請(qǐng)求
ng-href
當(dāng)瀏覽器打開頁面的時(shí)候,元素不具有href屬性,就不具有鏈接行為(為#號(hào)卻能夠點(diǎn)擊),ng-src對(duì)這一現(xiàn)象做了優(yōu)化,當(dāng)ng-href綁定的數(shù)據(jù)加載成功后,將這一屬性值,賦值給a標(biāo)簽的href屬性,讓a標(biāo)簽具有連接的行為。
跳轉(zhuǎn)
ng-class
是用來動(dòng)態(tài)創(chuàng)建類的一個(gè)指令,它的只是一個(gè)對(duì)象,對(duì)象中的舒心代表類的名稱,屬性值只能是一個(gè)Boolean
true,會(huì)將該類名添加到元素的class屬性中。
false,會(huì)將該該類名從該元素的class屬性中刪除。
{{ ngClassInfo }}
ng-style
用來動(dòng)態(tài)創(chuàng)建樣式,它的值是一個(gè)對(duì)象,對(duì)象中的屬性表示css屬性,值為css屬性值。
ng-if
判斷指令.
angular中沒有ng-else指令,可以通過ng-if模擬
111111111111222222222222
ng-switch
分支判斷
當(dāng)元素這是了ng-switch,元素是一個(gè)ie分支判斷的模板,所有分支都要包含在該元素內(nèi)。
通過on指令來設(shè)置判斷條件,ng-switach和on配合使用
ng-switch-when="key":表示判斷某一條件,當(dāng)on的綁定的數(shù)據(jù)值為該分支對(duì)應(yīng)的值的時(shí)候,執(zhí)行。
默認(rèn)11112222
ng-repeat
循環(huán)渲染模板
語法: ng-repeate="item in list";
內(nèi)置變量
$index 循環(huán)的索引值,從0開始計(jì)數(shù)
$first 第一次循環(huán)是true,其它次循環(huán)是false
$last 最后一次循環(huán)是true,其它此循環(huán)是false
$middel 除去第一次和最后一次值是true
$even 偶數(shù)次循環(huán)是true,奇數(shù)次循環(huán)是false
$odd 奇數(shù)次循環(huán)是true,偶數(shù)次循環(huán)是false
ng-include
模板定義在多帶帶文件中,通過ng-include引入進(jìn)來.
ng-include="url" 注意url是字符串
// 數(shù)據(jù)傳輸 var aMsgApp = app.controller("aMsg", function ( $scope ) { $scope.msg = "載入成功"; });
使用 ng-bind 或者 ng-cloak 而 不是使用 {{}} 插值方式,防止頁面渲染閃爍
避免在插值中使用復(fù)雜代碼
需要?jiǎng)討B(tài)設(shè)置 的 src 時(shí)使用 ng-src 而不使用 src中嵌套 {{}}
需要?jiǎng)討B(tài)設(shè)置 的 href 時(shí)使用 ng-href 而不是用 href 中嵌套 {{}}
通過對(duì)象參數(shù)和scope變量作為值來使用 ng-style 指令, 而 不是使用 scope 變量作為字符串通過 {{}} 用于 style 屬性。
自定義指令 directive();參數(shù)1: 指令的名稱
參數(shù)2: 構(gòu)造函數(shù),自定義指令式,只執(zhí)行一次,將一些復(fù)雜業(yè)務(wù)邏輯放在該函數(shù)中,最后改函數(shù)返回是一個(gè)對(duì)象(用來描述指令)
規(guī)則:
使用小駝峰命名。
在link function 中使用 $scope 。 在compile中, 定義參數(shù)的post/pre link functions 將在函數(shù)執(zhí)行時(shí)被傳遞,無法通過依賴注入改變它們。
指令添加自定義前綴避免與第三方指令沖突
可復(fù)用組件創(chuàng)建獨(dú)立作用域
使用 scope.$on("$destroy", fn) 來清除. 這點(diǎn)在使用第三方指令的時(shí)候特別有用.
返回對(duì)象restrict: 自定義指令的類型
E,該指令是一個(gè)自定義元素(element)
A,該指令在元素時(shí)屬性上(attributes)
C,該指令在元素的類上(class)
M,注釋指令(comment)
template: 傳遞的是模板字符串
templateUrl: 模板文件的路徑
replace: false
是否替換原有的元素,true會(huì)替換掉原有的元素,false不會(huì)替換掉元素。
當(dāng)設(shè)置true時(shí),會(huì)對(duì)controller中使用的參數(shù)$element 和 $attrs 有影響
controller
用來定義自定義指令的作用域。
this 指向的controller{}空對(duì)象
arguments默認(rèn)情況下是一個(gè)空數(shù)組,需要參數(shù)注入。
$scope 該指令的作用域
$element 該指令的元素
$attrs 該指令的元素的屬性
// directive() 自定義指令 app.directive("curtoms" , function () { console.log(111); return { // 指令類型 restrict: "EAC", // 模板字符串 // template: "自定義指令
", // 模板文件獲取 url templateUrl: "a.html", // replace表示是否替換原來的元素,true是替換,false不替換 // replace: false, replace: true, controller: function ( $scope, $element, $attrs ) { // this 指向 controller{} 空對(duì)象 console.log( $scope, $element, $attrs ); } } });
scope
隔離自定義的作用域的屬性,通過對(duì)其社會(huì)字一個(gè)對(duì)象來隔離指令的作用域。
如果值是true或者false,指令的作用域就會(huì)忽略自身作用域,而去尋找父級(jí)作用域中的變量。
如果值是空對(duì)象{} ,作用域會(huì)指向該空對(duì)象
directive返回對(duì)象中的scope和controller
自定義指令中,scope屬性對(duì)controller的影響:
如果scope的值是true,在controller中,定義與父作用域中相同變量時(shí),自定義指令中的變量不會(huì)受到副作用于中的變量的影響。
如果scope是一個(gè)false,在controller中,定義與父作用域相同變量時(shí),該變量與父作用域中的變量同步(同時(shí)修改,數(shù)據(jù)雙向綁定)
如果scope是一個(gè)對(duì)象,在controller中,定義與父作用域相同的變量時(shí),自定義指令中的變量不會(huì)收到父作用域的變量影響。
app.directive("myCutom", function () { return { restrict: "E", template: "{{ msg }} -- {{ title }}
", // scope: {}, // scope: true, scope: false controller: function ( $scope, $element, $attrs ) { $scope.title = "aaaa"; $scope.msg = "xixixi"; } } });
@修飾符
可以屏蔽模板中變量去controller作用域中尋找值的過程,而是讓其去該自定義指令所在元素的屬性中尋找數(shù)據(jù)變量. 忽略自定義指令的scope。
@修飾符會(huì)去自定義指令中所在元素的屬性去尋找。
屬性值是插值傳入,作為普通屬性處理。
app.directive("myCutom", function () { return { restrict: "E", template: "{{ msg }} -- {{ title }}
", scope: { // 告知 自定義指令 不需要從 自己的作用域中尋找 變量 title: "@myTitle" }, controller: function ( $scope, $element, $attrs ) { $scope.title = "aaaa"; $scope.msg = "xixixi"; } } });
=修飾符
通過在scope屬性中定義含有=修飾符的變量時(shí),可以取得父作用域中的變量,通過屬性映射.
作用:自定義指令作用域中變量與父作用域的雙向綁定過程.
注意:自定義元素中的屬性值是一個(gè)父作用域中的一個(gè)變量,在自定義指令中當(dāng)作一個(gè)變量來處理。
template,中的數(shù)據(jù)和 父級(jí)的作用域$scope,數(shù)據(jù)綁定
tempalte: "{{title}}
",
app.controller("main", function ( $scope ) { $scope.title = ""; });
link
操作自定義指令的DOM
link的函數(shù)
this指向window
arguments:
1 scope, 指令作用域
2 jqlite 獲取自定義元素
3 attrs 自定義指令元素上的屬性
// 操作自定義指令元素 // @param {Object} scope 子作用域 // @param {Object} jqlite JQ對(duì)象 // @param {Object} attrs 自定義上的屬性 link: function ( scope, jqlite, attrs ) { // this -> window var el = jqlite.children("h1").attr("nodeValue", 1); // 使用 data 自定義屬性 ,會(huì)自動(dòng)省略 data- for ( var i=0; icomplie
this指向的是指令描述對(duì)象.
參數(shù)1: jqlite 獲取的自定義元素
參數(shù)2: attrs 自定義指令所在元素的屬性
返回一個(gè)函數(shù), 指向 link 函數(shù)
在返回函數(shù)中,可以操作自定義指令所在元素.嘻嘻哈哈
transclude
它告訴自定義指令,要將自定義元素中未知的元素內(nèi)容插入到已知模板具有ng-transclude指令所在的元素中(添加自定義指令元素中的未知元素)
未知元素:自定義標(biāo)簽中的元素.告知自定義指令,要將自定義中未知的元素內(nèi)容插入到已知模板。
條件: 模板標(biāo)簽上具有ng-transclude指令
需要設(shè)置 transclude: true.現(xiàn)象:模板標(biāo)簽會(huì)包裹自定義標(biāo)簽內(nèi)的內(nèi)容.
app.directive("myDirective", function () { return { restrict: "E", template: "", transclude: true } });require
自定義指令引用其它指令,作為link()方法的第四個(gè)參數(shù).
例如,將ngModel引入到自定義指令中. 在link方法中可以訪問到ngModel中的屬性值require: "ngModel"// 自定義指令 app.directive("myDirective", function () { // 返回一個(gè)描述指令對(duì)象 return { restrict: "A", // 引入其它指令 require: "ngModel", link: function ( scope, jqlite, attrs, ngModel ) { // $watch 檢測某個(gè)值 發(fā)生改變,觸發(fā)某個(gè)函數(shù) // 當(dāng) ngModel 值發(fā)生改變, 觸發(fā)函數(shù) scope.$watch(attrs.ngModel, function () { console.log(ngModel.$viewValue); }); } } });服務(wù)對(duì)一些方法的封裝,復(fù)用方法更為簡便。例如:消息系統(tǒng),作為消息服務(wù).
使用服務(wù),利用參數(shù)注入即可。大駝峰和小駝峰都可
將業(yè)務(wù)邏輯封裝成服務(wù)
將業(yè)務(wù)邏輯封裝成 service 而非 factory
使用 $cacheFactory 進(jìn)行繪畫級(jí)別的緩存。 應(yīng)用于緩存請(qǐng)求或復(fù)雜運(yùn)算的結(jié)果。
內(nèi)置服務(wù)$timeout
對(duì)setTimeout()的封裝app.controller("main", function ($scope, $timeout) { $timeout(function () { console.log(this); console.log(arguments); }, 2000); });$interval
對(duì)setInter();的封裝app.controller("main", function ($scope, $interval) { // 定義一個(gè)時(shí)間 $scope.date = new Date(); $interval(function () { // 重新定義日期 $scope.date = new Date(); }, 1000); });$http
異步請(qǐng)求配置參數(shù):
method: 請(qǐng)求方式 "GET","POSt"
url: 請(qǐng)求的地址
$http 方法執(zhí)行完后鏈?zhǔn)秸{(diào)用success(),請(qǐng)求成功的回調(diào)函數(shù)POST請(qǐng)求:
通過設(shè)置data屬性添加POST請(qǐng)求發(fā)送數(shù)據(jù)
params屬性添加請(qǐng)求的參數(shù)數(shù)據(jù)// $http 服務(wù) $http({ method: "GET", url: "data/service.json" }).success(function ( res ) { if ( res.errno === 0 ) { $scope.msg = res.msg; console.log(res); } });$http({ method: "POST", url: "demo.json", // 該屬性會(huì)將鍵值對(duì)轉(zhuǎn)化成url上參數(shù) params: { id: 11 }, // post請(qǐng)求 添加請(qǐng)求數(shù)據(jù) data: { username: "aa" } });$http.get,$http.post
$http服務(wù)中的get請(qǐng)求和post請(qǐng)求簡寫方式
params 配置請(qǐng)求參數(shù)// get 請(qǐng)求 $http.get("data/service.json", { params: { id: 1 } }) // 請(qǐng)求成功 .success(function ( res ) { console.log( res ); });// post 請(qǐng)求 // 參數(shù)1:url ,參數(shù)2:請(qǐng)求攜帶的數(shù)據(jù) $http.post("data/service.json", { id: 1 }) // 請(qǐng)求成功 .success(function ( res ) { console.log(res); });promise對(duì)象
自定服務(wù)
允諾對(duì)象,在內(nèi)部是一個(gè)異步操作,當(dāng)操作完成時(shí),這個(gè)對(duì)象會(huì)實(shí)現(xiàn)它的允諾.
特點(diǎn): 可以無限添加允諾。 一定在某些操作完成時(shí)才出發(fā)。
規(guī)范中允諾對(duì)象使用 then方法.需要各種服務(wù)以支持各種功能,也可以手動(dòng)開啟或關(guān)閉某些服務(wù)以達(dá)到相應(yīng)的功能.
factory()
工廠模式定義自定義服務(wù)
參數(shù)1:服務(wù)名稱
參數(shù)2:服務(wù)工廠方法
返回值:服務(wù)對(duì)象,這個(gè)對(duì)象提供其它控制器使用var app = angular.module("app", []); // 其它控制器使用服務(wù) app.controller("facotryCtrl", function ( $scope, news ) { $scope.msg = news.data; }); // factory 定義 服務(wù) app.factory("news", function () { return { data: "嘻嘻哈哈" } });service
面向?qū)ο髣?chuàng)建服務(wù)
參數(shù)1:服務(wù)名稱
參數(shù)2:服務(wù)的構(gòu)造函數(shù)(構(gòu)造函數(shù)中需要使用this來暴露接口)// 使用 service 自定義服務(wù) app.service("data", function () { this.title = "嘻嘻哈哈"; });路由使用組件配合使用:
angular-route.js
angular-ui-router.js
用來尋找頁面,通常通過配置一些路由來映射一些頁面路由:就是URL到函數(shù)的映射。
ngRoute需要在程序入口處引入,添加到依賴集合中
angualr.module("app", ["ngRoute"]);ng-view
動(dòng)態(tài)渲染的視圖,視圖如何渲染根據(jù)路由決定
渲染視圖需要在頁面初始化之前知道路由配置.
使用congfig();congfig();
在應(yīng)用程序執(zhí)行之前執(zhí)行一個(gè)配置方法,在頁面還未被渲染,可以將路由邏輯放入該方法中。
回調(diào)函數(shù):
this -> window
默認(rèn)參數(shù)是空的,需要將服務(wù)注入// 配置 app.config(function ( $routeProvider ) { $routeProvider.when("/", { // 模板 // template: "嘻嘻哈哈", templateUrl: "a.html", // 控制器 controller: function ( $scope ) { console.log( $scope ); $scope.style = { color: "deeppink" } } });$routeProvider
路由服務(wù):
路由供給服務(wù),提供一個(gè)when方法,供使用配置路由.controller
在路由對(duì)象中,可以通過controller屬性,為路由對(duì)象添加控制器,創(chuàng)建一個(gè)作用域,讓模板可以使用作用域中的變量。template
配置模板字符串templateUrl
配置外部模板
會(huì)發(fā)送異步請(qǐng)求otherwise
重定義路由
配置兩個(gè)路由以上,otherwise 才會(huì)有效果.
配置參數(shù)為 redirectTo 來重定向到不同路由,值是定義過路徑.// app var app = angular.module("app", ["ngRoute"]); // controller app.controller("routerCtrl", function ( $scope ) { $scope.shop = "shopPage1"; }); // config app.config(function ( $routeProvider ) { // 配置首頁 路由 $routeProvider.when("/", { template: "{{ index }}
", controller: function ( $scope ) { $scope.index = "indexPage"; } }) // 配置 shop 頁面 路由 .when("/shop", { template: "{{ shop }}
", controller: function ( $scope ) { // $scope.shop = "shopPage"; } }) // 其它路由 重定義 到 / 目錄中 .otherwise({ redirectTo: "/" }); });路由參數(shù)
路由路徑配置參數(shù)(參數(shù)名前需要加:冒號(hào))
將獲取路由參數(shù)服務(wù)注入控制器中($routeParams注入控制器中).app.config(function ( $routeProvider ) { // 配置參數(shù) $routeProvider.when("/shop/:pageNum/:type", { template: "{{ shop }}
", // 參數(shù)注入 controller: function ( $scope, $routeParams ) { $scope.shop = "shopPage"; console.log( $routeParams ); } }); });路由時(shí)間
路由時(shí)間通常定義需要監(jiān)聽該事件的控制器中,在全局作用域下監(jiān)聽,通過對(duì)作用域$on()方法監(jiān)聽路由事件。
例如:$routeChangeSuccess
監(jiān)聽路由改變成功
參數(shù)1: 表示事件對(duì)象
參數(shù)2:表示當(dāng)前路由對(duì)象
參數(shù)3:表示前一個(gè)路由(如果當(dāng)前沒有前一個(gè)路由對(duì)象,因此參數(shù)會(huì)是undefined)app.run(function ( $rootScope ) { $rootScope.$on("$routeChangeSuccess", function ( ev, routeObj, preRouteObj ) { }); });$location
管理地址欄狀態(tài)信息,包括query,path
path(): 改變路由中的path.
讀:$location.path();
設(shè):$loction.path(arg);app.run(function ( $rootScope, $location ) { $rootScope.$on("$routeChangeSuccess", function ( ev, routeObj, preRouteObj ) { // var q = $location.path(); // 讀 $location.path("/xixi"); // 設(shè)置 }); });ui-routerngRoute: 每個(gè)頁面對(duì)應(yīng)一個(gè)地址(path), 需要渲染那個(gè)頁面,就需要配置路由.
uiRouter: 引入state(狀態(tài))概念,如果哪個(gè)頁面如果顯示,渲染出對(duì)應(yīng)的頁面,渲染之后會(huì)有一種狀態(tài),可以將該狀態(tài)記錄,配置路由ui-view
在ui-router 中使用的指令ui
$stateProvider
參數(shù)注入到config()來定義狀態(tài)app.config(function ( $stateProvider ) {});state();
定義狀態(tài)
參數(shù)1:狀態(tài)名稱
參數(shù)2:配置參數(shù)
url: 狀態(tài)頁面的地址
tempate: 狀態(tài)對(duì)應(yīng)頁面的模板
controller 定義狀態(tài)對(duì)應(yīng)頁面的作用域// 參數(shù)注入 ui.router var app = angular.module("app", ["ui.router"]); // 配置路由 app.config(function ( $stateProvider ) { // $stateProvider 定義狀態(tài) console.log( $stateProvider ); $stateProvider.state("home", { // 配置 #/ url: "/", template: "{{ indexPage }}
", controller: function ( $scope ) { $scope.indexPage = "indexPage"; console.log( this,arguments ); } }) .state("shop", { url: "/shop", template: "{{ shopPage }}
", controller: function ( $scope ) { $scope.shopPage = "shopPage"; console.log( this,arguments ); } }) });uiRouter路由參數(shù)規(guī)則
路由規(guī)則:固定值:/key
可捕獲的參數(shù): /:key
限制字段類型: /{key:type} type: int,string
捕獲query: ?queryNum&queryNum2
$stateProvider.state("shop", { // url: "/shop/xixi/is/100?form=10&to=20" url: "/shop/:value/is/{pageNum:int}?form&to", template: "{{ shopPage }}
", controller: function ( $scope, $stateParams ) { console.log( $stateParams ); $scope.shopPage = "shopPage"; } })$urlRouterProvider
when(); 將參數(shù)1的路由路徑重定向到參數(shù)2路由路徑
otherwise(); 匹配不存在的路由,跳轉(zhuǎn)到定義過的路由.// 配置 不存在路由 $urlRouterProvider.when("", "/").otherwise("/error");views 多視圖
ui-router 可以渲染頁面中的多個(gè)視圖,通過為頁面中ui-view指令添加名稱,多個(gè)視圖渲染需要在config() 配置。app.config(function ( $stateProvider, $urlRouterProvider ) { $stateProvider.state("home", { url: "/", views: { leftView: { template: "leftView
" }, rightView: { template: "rightView
" }, contentView: { template: "contentView {{ msg }}
", controller: function ( $scope ) { $scope.msg = "中間模塊" } } } });view 嵌套
在 ui-reouter 中視圖是可以嵌套。
在state() 定義狀態(tài)名稱的時(shí)候添加命名空間。
路由需要有順序,定義在父路由的后邊。
注意:父視圖需要添加動(dòng)態(tài)視圖ui-view
多視圖不能與嵌套視圖同時(shí)使用
匹配主頁,定義路徑不需要添加 "/shop", 直接 "shop";即可.app.config(function ( $stateProvider, $urlRouterProvider ) { $stateProvider.state("home", { url: "/", template: "index" }) .state("home.shop", { url: "shop", template: "shopPage
" }); $urlRouterProvider.when("","/"); });路由事件
添加在全局作用域$rootScope 下檢測路徑變化
事件名以state開頭
參數(shù)1: 事件對(duì)象
參數(shù)2: 當(dāng)前路由對(duì)象
參數(shù)3: 當(dāng)前路由參數(shù)對(duì)象
參數(shù)4: 前一個(gè)路由對(duì)象
參數(shù)5: 前一個(gè)路由參數(shù)對(duì)象app.run(function ( $rootScope ) { $rootScope.$on("$stateChangeSuccess", function ( ev, routeObj, routeParamsObj, preRouteObj, preRouteParamsObj ) { console.log( this,arguments ); }) });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/79920.html
摘要:下一篇譯精通使用開發(fā)二原版書名第一章之道這一章主要是介紹,包括這個(gè)框架以及它背后的項(xiàng)目。幸運(yùn)的是,擁有一個(gè)活躍的,支持度高的社區(qū)。另外,社區(qū)還為已經(jīng)存在的工具箱里貢獻(xiàn)了許多有意思的工具。 下一篇:【譯】《精通使用AngularJS開發(fā)Web App》(二) 原版書名:Mastering Web Application Development with AngularJS Ch...
摘要:本書的這一部分將為隨后的章節(jié)打下基礎(chǔ),會(huì)涵蓋模板,模塊化,和依賴注入。本書的小例子中我們會(huì)使用未經(jīng)壓縮的,開發(fā)友好的版本,在的上。作用域也可以針對(duì)特定的視圖來擴(kuò)展數(shù)據(jù)和特定的功能。 上一篇:【譯】《精通使用AngularJS開發(fā)Web App》(一) 下一篇:【譯】《精通使用AngularJS開發(fā)Web App》(三) 原版書名:Mastering Web Application D...
摘要:在一段時(shí)間內(nèi),谷歌曾經(jīng)試圖默許使用這個(gè)新來包含已有的即也可以被成為,而僅稱為。隨著名稱混淆帶來的各種問題,之后谷歌開始重新強(qiáng)調(diào)使用框架正式名稱,即中的項(xiàng)目稱為,中的項(xiàng)目稱為。 Angular 與 AngularJs 之間的糾纏不清 showImg(https://segmentfault.com/img/remote/1460000017716109?w=815&h=512); 市場關(guān)...
摘要:開始使用現(xiàn)在創(chuàng)建一個(gè)名為的文件,它將會(huì)是一個(gè)基于的網(wǎng)上書店應(yīng)用。這將初始化應(yīng)用程序,并告訴要在這一部分活躍。將為每個(gè)元素增加元素。控制器和視圖之間的粘合劑,而且會(huì)注入到。現(xiàn)在我們添加書籍?dāng)?shù)組的對(duì)象到對(duì)象,這個(gè)對(duì)象對(duì)視圖是可見的。 編者注:我們發(fā)現(xiàn)了比較有趣的系列文章《30天學(xué)習(xí)30種新技術(shù)》,準(zhǔn)備翻譯,一天一篇更新,年終禮包。以下是第二天技術(shù)的譯文。 昨晚我完爆了一天一技術(shù)的任務(wù)...
流行框架 簡介 angularjs是一款非常優(yōu)秀的前端高級(jí)JS框架,由谷歌團(tuán)隊(duì)開發(fā)維護(hù),能夠快速構(gòu)建單頁web應(yīng)用,化繁為簡 無論是angularjs還是jQuery都是用原生JS封裝的 庫:對(duì)代碼進(jìn)行封裝,調(diào)用封裝的方法,簡化操作 傳統(tǒng)方式是用get方式獲取元素,然后點(diǎn)方法 jQuery庫實(shí)現(xiàn)了對(duì)獲取方式的封裝,對(duì)方法的封裝 框架:提供代碼書寫規(guī)則,按照規(guī)則去寫代碼,框架會(huì)幫我們實(shí)現(xiàn)響應(yīng)的功能...
閱讀 2021·2019-08-30 15:52
閱讀 2975·2019-08-29 16:09
閱讀 1323·2019-08-28 18:30
閱讀 2453·2019-08-26 12:24
閱讀 1089·2019-08-26 12:12
閱讀 2273·2019-08-26 10:45
閱讀 565·2019-08-23 17:52
閱讀 810·2019-08-23 16:03