核心:組件css
React->UI組件(V)
- React,虛擬DOM,更新DOM次數少,內容也少。速度快
- FlUX架構(UI組件化和數據單向更新)
- 服務器渲染(預渲染應用發送客戶端,爬蟲依賴服務器的響應)
Vue->雨溪大牛我的主導,只關注WEB,服務器渲染(缺點)
- 簡單
- 靈活
- 性能html
Amber Cli(模塊的構建) -> Angular CLI <- Webpack(打包)
- Angular CLI (2以上的構建工具)
- npm install -g @angular/cli (安裝)
- ng version
- ng new 項目名字 –skip-install(網絡很差1)
- cnpm install(網絡很差2)
- 編譯,開發同步 np serve
- 測試打包 test build前端
安裝報錯
constructor(_configPath, schema, configJson, fallbacks = []) { 重裝 npm uninstall -g angular-cli npm cache clean
C:\Users\null\AppData\Roaming\npm\node_modules\@angular\cli\models\config\config .js:17 constructor(_configPath, schema, configJson, fallbacks = []) { ^ SyntaxError: Unexpected token = at exports.runInThisContext (vm.js:53:16) at Module._compile (module.js:373:25) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Module.require (module.js:353:17) at require (internal/module.js:12:17) at Object.<anonymous> (C:\Users\null\AppData\Roaming\npm\node_modules\@angul ar\cli\models\config.js:3:18) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10)
升級Node version 6.x or higher
Linuxnode
npm install -g n n stable
window直接替換就好了react
運行報錯
The "@angular/compiler-cli" package was not properly installed.
- Global package:
rm -rf node_modules dist
npm uninstall -g @angular/cli
npm cache clean- Reinstall and play (global)
npm install -g @angular/cli@latest
npm install
ng serve
https://stackoverflow.com/questions/42925690/angular2-cli-error-angular-compiler-cli-package-was-not-properly-installed/43021209
@Component**組件元數據裝飾器**可讓開發者經過Angular 的Component建立一個相似Java的class,並同時提供額外的元數據用於定義在運行環境中,根據元數據的值來渲染組件,這個component將如何運行/實例化以及被使用。
Template 定義組件的外觀
Controller包含組件的全部屬性和方法,頁面邏輯,處理模板上發生的事件git
@NgModuleangularjs
angular-cli.json
- 啓動加載頁面 index.html
- 啓動加載腳本 main.ts
- 腳本的工做 導入依賴模塊,主模塊app.module.ts,主模塊的依賴模塊…….在index.html尋找啓動模塊的主組件對應的css選擇器github
利用url分配視圖狀態
- 子路由
- 保護路由
- 輔助路由web
ctrl + 1 導入component ng new project routing
生成一個路由模塊express
app-routing.modul.ts路由配置,不用/開頭
const routes : Routes = [ {path:'',component:IndexComponent }, ...... ] 第一種: 路由使用,使用數組是要解決增長傳參的問題,字符串不方便 <a [routerLink] = "['/']" > 主頁 </a> 第二種: <input type="button" value="主頁" (click)= "toIndex()" 事件綁定 控制器中定義 export class AppComponent { constructor(private router: Router){} toIndex(){ this.router.navigate(['/']); } } 404組件,通配符定義 **解決輸入未定義路徑報錯的狀況** {path:'**',component:404Component },
404組件頁要放在最後,由於Ag路由使用先配置,先匹配的原則。
查詢參數傳遞參數
/product?id=1&name=2 => ActiveRoute.queryParams[id]
路由路徑傳遞參數
{path:/product/:id} => /product/1 => ActivatedRoute.params[id]
路由配置傳遞參數
{path:/product,component: ProductComponent,data:[{isProd:yrue}]}
=> ActivatedRoute.data[0][isProd]
<a [routerLink] = "['/product']" [queryParams]="{id : 1}" > 主頁 </a>
子組件:接收參數
自組件html:
{{ productId }}
定義:
{path:product/:id」,component:ProductComponent },
html:
<a [routerLink] = "['/product',1]" > 主頁 </a>
子組件:prams 替換queryParams
問題:當咱們進行相同組件(參數不一樣)的路由切換時,沒法正常切換(不能切換)?
問題來源:組件只建立一次,建立時constructor,ngOnInit被調用
問題解決:參數快照(snapshot) -> 參數預約
生成子組件=>定義模板內容=>接收路由參數=>添加子組件=>添加子組件鏈接
主路由(組件只在主路由顯示):
outlets:{primary:'home',aux:"chat"}
經過返回的布爾值判斷執行動做。
注意CanDeactivate多了一個泛型,也就是要聲明一下要保護的組件
Resolve守衛要解決的問題就是當咱們發送一個HTTP請求,要求路由切換時,請求是有延遲的,模板上的{{數據}}不能及時顯現出來。能夠在進入路由以前讀取數據,馬上顯現數據(略)
在調用一個類的時候,先要實例化這個類,生成一個對象。
問題:寫一個類,過程當中要調用到不少其它類,甚至這裏的其它類,也要「依賴」於更多其它的類。手工實例化過於頻繁,臃腫。
依賴注入,全稱是「依賴注入到容器」, 容器(IOC容器)是一個設計模式,它也是個對象,你把某個類(無論有多少依賴關係)放入這個容器中,能夠「解析」出這個類的實例。
因此依賴注入就是把有依賴關係的類放入容器(IOC容器)中,而後解析出這個類的實例。
代碼控制權從代碼內部轉到代碼外部
在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。
傳統應用程序是由咱們本身在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴對象;爲什麼是反轉?由於由容器幫咱們查找及注入依賴對象,對象只是被動的接受依賴對象,因此是反轉;哪些方面反轉了?依賴對象的獲取被反轉了。
Angular 注入點只有一個,構造函數
好處:
當咱們須要重用ProductComponent,並且還須要另外一個productService類時
實例:
ng g component product1 ng g service shared/product
@Injetable()裝飾器:把其餘服務注入該服務中。將該服務是否能注入其餘模塊是根據其做用域判斷的
提供器聲明在模塊中
綁定到模板
擁有相同的Token,可是擁有不一樣的類
提供器做用域:聲明在組件中
ng g component product2 ng g service shared/anotherProduct
引入控制器:
綁定到模板
聲明提供器,簡單的new一下。
遇到問題:服務對象須要根據條件來決定具體實例化哪一個對象,或者實例化對象,也就是調用構造函數時須要傳遞參數
工廠方法建立的對象是單例對象
問題:方法內部實例化方法,該方法和服務對象緊密的耦合在了一塊兒
問題:用具體值,變量來實現其依賴注入
手工使用注入器(避免使用,錯誤風格)
容許將組件控制器的屬性,方法與組件的模板鏈接起來
Ag4默認改成單向數據綁定。
Ag1使用雙向(性能問題),在頁面維護一個存有全部表達式的列表,事件發生,反覆遍歷列表,確認數據是否徹底同步,耗性能
組件控制器的屬性和方法與組件的模板鏈接
事件能夠是函數調用,屬性賦值,DOM事件,自定義事件
差值表達式至關於屬性綁定
控制器: private imgUrl:String="http://placehold.it/320x150"; 模板: <img [src]="imgUrl"> <img src="{{imgUrl}}"> 插值
event.target.value DOM屬性
event.target.getAttribute(‘value’) HTML
DOM屬性隨着輸入的改變而改變(指定當前值),HTML屬性不變(指定初始值,初始化DOM值,任務完成)
還有一個,input的disabled的值的改變沒法改變disabled的設置(true,false),可是DOM的設置是有效的
<input value="unchanging" (input)="doOnInput($event)"
當沒有DOM屬性綁定時,就使用html屬性綁定,好比td
主要使用表單from在, 記憶方法:盒子[ ]裏放香蕉( )
[(ngModel)] = ""
{{birthday | date:'yyyy-MM-dd HH:mm:ss' | }} {{name | number:'2.1-4' | }} 整數幾位+小數最少幾位+小數最多幾位 {{name | async}} 流
ng g pipe pipe/multiple {{size | multiple}}
紅色方法調用一次,綠色方法調用屢次.共九個方法
接口對JS或者TS開發者可選,最好添加,優勢:IDE的支持和強類型的檢查
純html表單:顯示錶單項,校驗用戶輸入(required,pattern 驗證消息過於模糊,消失時間過快,樣式不能修改),提交表單數據(較好的應該是提交數據以前,調用數據處理方法,校驗數據合法性,並且還能指定數據提交方法(異步,wobsocket,http)),不能知足特定需求,不夠靈活。
npm init -y 引入帶有默認配置的package。j'son npm i @types/node -save
構建
ng build -> dist
部署
添加新的部署策略 如圖 Ha'shLocationStrategy 解決構建後沒法跳轉路由的問題 url中出現了一個#號
ng serve ng build + 環境參數 啓動參數添加 --env=prod 生產環境 環境文件裏面能夠生成任意的文件屬性,能夠去引用