ng build --prod --aot 打包
import * as xxx from ‘xxx’: 會(huì)將 若干export導(dǎo)出的內(nèi)容組合成一個(gè)對(duì)象返回;
import xxx from ‘xxx’:只會(huì)導(dǎo)出這個(gè)默認(rèn)的對(duì)象作為一個(gè)對(duì)象摇零,
TS 榄笙?可選參數(shù)
interface IFRequestParam {
url: string;
msg?: string;
config?: any;
data?: any;
}
angular中的pipe是用來(lái)對(duì)輸入的數(shù)據(jù)進(jìn)行處理许蓖,如大小寫(xiě)轉(zhuǎn)換令杈、數(shù)值和日期格式化等排霉。
使用 @Pipe 裝飾器定義 Pipe 的 metadata 信息缎玫,如 Pipe 的名稱(chēng) - 即 name
實(shí)現(xiàn) PipeTransform 接口中定義的 transform 方法
//父子通訊
父 子
@ViewChild('tagInput') 變量類(lèi)型為子組件類(lèi)颈走,可以使用子組件的方法等膳灶,同時(shí)觸發(fā)鉤子
<app-address-detail [address]="currentAddress"></app-address-detail>
ts代碼:
@Input() address: Address;
子 父 和vue emit一樣
@Output()屬性裝飾器來(lái)實(shí)現(xiàn)。 實(shí)現(xiàn)步驟:首先需要在子組件中定義事件(使用EventEmitter方法)立由,子組件的事件被觸發(fā)時(shí)引發(fā)父組件的事件響應(yīng)
// app.module.ts
@NgModule({
...
providers: [MyService]
})
export class AppModule {}
//my-service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class MyService {
constructor() { }
}
//angular6+之后只要在service中申明 6之前需要在引用時(shí) providers: [MyService]
@Injectable({
providedIn: 'root',
})
@Inject(MyService )注入//組件調(diào)用時(shí)使用 @Injectable()可注入//service內(nèi)部 組件調(diào)用時(shí)要 @NgModule({providers: [MyService]}) @Injectable({providedIn: 'root',}) //service聲明 且調(diào)用時(shí)不要申明
@Optional()
@Inject(MyService )
@Optional 表示可有可無(wú), 如果沒(méi)有使用 Optional, 在沒(méi)有provider 而嘗試注入 service 的情況下, angular 是會(huì)報(bào)錯(cuò)的哦.//@Inject(MyService )注入時(shí)使用
HostListener - 聲明一個(gè)主機(jī)監(jiān)聽(tīng)器轧钓。當(dāng)主機(jī)元素發(fā)出指定的事件時(shí),角色將調(diào)用裝飾的方法锐膜。 # HostListener -將聽(tīng)取主元素毕箍,@HostListener聲明發(fā)出該事件。
HostBinding -聲明主機(jī)屬性binding.Angular在更改檢測(cè)期間自動(dòng)檢查主機(jī)屬性綁定道盏。如果綁定發(fā)生變化而柑,它將更新指令的主機(jī)元素。 # HostBinding -將綁定屬性Host元素荷逞,如果有約束力的變化媒咳,HostBinding將更新主機(jī)元素。
@Component({ changeDetection: ChangeDetectionStrategy.OnPush}), 監(jiān)聽(tīng)change策略
@HostListener('mouseleave')
mouseleave() {
this.backgroundColor = 'white';
}
https://juejin.im/post/597fe587518825563e037bd3(簡(jiǎn)介)
http://www.reibang.com/p/fc96f60e5745(詳解V衷丁)
Reactive Extensions for JavaScript基于可觀(guān)測(cè)數(shù)據(jù)流在異步編程應(yīng)用中的庫(kù)
響應(yīng)式編程(RP —— Reactive Programming)
響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式涩澡。在編程語(yǔ)言中很方便地表達(dá)靜態(tài)或動(dòng)態(tài)的數(shù)據(jù)流,而相關(guān)的計(jì)算模型會(huì)自動(dòng)將變化的值通過(guò)數(shù)據(jù)流進(jìn)行傳播坠敷∶钔—— wikipedia
響應(yīng)式編程是使用異步數(shù)據(jù)流進(jìn)行編程射富。常見(jiàn)的異步數(shù)據(jù)流包含Event buses。用包含這些事件在內(nèi)的任何東西創(chuàng)建數(shù)據(jù)流(Data stream)粥帚,監(jiān)聽(tīng)他并作出響應(yīng)胰耗。
只關(guān)注業(yè)務(wù)邏輯互相依賴(lài)的事件而不是實(shí)現(xiàn)細(xì)節(jié)
適用于大量和數(shù)據(jù)有關(guān)的事件交互,特別是高實(shí)時(shí)性要求
Functional Programming 基本觀(guān)念
Functional Programming 是一種編程范式(programming paradigm)芒涡,就像 Object-oriented Programming(OOP)一樣柴灯,就是一種寫(xiě)程式的方法論,這些方法論告訴我們?nèi)绾嗡伎技敖鉀Q問(wèn)題拖陆。
我們可以寫(xiě)成
const add = (a, b) => a + b
const mul = (a, b) => a * b
const sub = (a, b) => a - b
sub(add(5, 6), mul(1, 3))
我們把每個(gè)運(yùn)算包成一個(gè)個(gè)不同的 function弛槐,并用這些 function 組合出我們要的結(jié)果懊亡,這就是最簡(jiǎn)單的 Functional Programming依啰。
函數(shù)風(fēng)格的編程特點(diǎn):
第一等公民是函數(shù)
帶有閉包的Lambdas/Anonymous函數(shù)
不變性,大部分無(wú)態(tài)處理店枣,沒(méi)有狀態(tài)和變量
高并發(fā)
無(wú)副作用的調(diào)用
通過(guò)tail call實(shí)現(xiàn)遞歸的性能優(yōu)化速警。
模式匹配(Haskell, Erlang)
懶賦值(Miranda, Haskell)
Homoiconicity(類(lèi)似LISP)
Iterator(迭代器) 跟 Observer(觀(guān)察者) 兩個(gè) Pattern模式,這兩個(gè) Pattern 都是漸進(jìn)式的取得元素鸯两,差異在于 Observer 是靠生產(chǎn)者推送資料闷旧,Iterator 則是消費(fèi)者去要求資料,而 Observable 就是這兩個(gè)思想的結(jié)合
//Iterator Pattern
class IteratorFromArray {
constructor(arr) {
this._array = arr;
this._cursor = 0;
}
next() {
return this._cursor < this._array.length ?
{ value: this._array[this._cursor++], done: false } :
{ done: true };
}
map(callback) {
const iterator = new IteratorFromArray(this._array);
return {
next: () => {
const { done, value } = iterator.next();
return {
done: done,
value: done ? undefined : callback(value)
}
}
}
}
}
var iterator = new IteratorFromArray([1,2,3]);
var newIterator = iterator.map(value => value + 3);
newIterator.next();
// { value: 4, done: false }
newIterator.next();
// { value: 5, done: false }
newIterator.next();
// { value: 6, done: false }