angular11原始碼探索七 服務二

2022-02-19 06:44:26 字數 2911 閱讀 7607

提供類的例項,使用類提供者

providers :

簡寫令牌和類名一起的快捷寫法

providers: [productservice]

這是我們開發很正常這樣寫的

建立乙個服務

@injectable()

export class testservice

}// 使用

constructor(private readonly testservice: testservice)

usevalue提供簡單值時,使用

模組配置

providers :[ ]
或者分開獨立寫乙個檔案

serviceurl: "www.serviceurl.com\api",

isdevleomentmode: true

};

凍結配置不讓它修改

serviceurl: "www.serviceurl.com\api",

isdevleomentmode: true

});

useexisting別名

的意思是使用已經註冊的型別注入到這裡(別名),比如下面示例意思是將apiservice起個叫otherapiservice的別名

正常使用

providers: [

]頁面使用

constructor(

@inject(api_url) private other: testservice

) from '@angular/core';

@injectable()

export class randomprovider

getrandomnumber(): number }

注入 ngmodule (

}]...

})使用 constructor(

private random:randomprovider

) }]

...})

使用 constructor( @inject('random_array') private threerandomvalues: number )

如果工廠函式本身具有依賴項,則可以在deps屬性中宣告它們。

ngmodule (

}]...

})

@ngmodule( else 

}}, loggerservice]

})// logger.service.ts,乙個簡單的列印日誌的服務

import from '@angular/core'

@injectable()

export class loggerservice

log (messgae: string)

}

這裡有一點需要注意,如果多個元件共用這個服務,那麼生成的例項都是相同的,因為工廠方法建立的物件是乙個單例物件,工廠方法只會在建立第乙個物件的時候被呼叫一次,然後在整個應用當中所有被注入的服務的例項都是同乙個物件

問題一

在方法內部,我們手動例項化了乙個new loggerservice(),意味著工廠方法與這個類是一種強耦合的關係,而我們又宣告了loggerservice的提供器,所以我們可以採用下面這種方式來解耦,即利用第三個引數deps來宣告工廠方法所依賴的引數

@ngmodule( else 

},deps: [loggerservice]

}, loggerservice]

})

這樣一來就不需要我們手動的去例項化(new loggerservice()),這時的angular將會使用loggerservice這個提供器來例項化乙個loggerservice的例項,並將其注入到productservice的工廠方法的引數當中

問題二

我們是根據乙個隨機數來決定例項化哪個物件,這樣測試是可以的,但是在發布的時候就不適用了,通常在這種情況下,我們可以使用乙個變數來決定呼叫哪個方法,然後同樣的在deps當中進行依賴宣告,然後在當作引數的時候傳遞進去

@ngmodule( else 

},deps: [loggerservice, 'is_dev_env']

}, loggerservice,

]})

同樣的,可以不單一的注入乙個固定的值,也是可以注入乙個物件,方便維護

@ngmodule( else 

},},

loggerservice,

}]})

我們舉個小案例方便深入理解下

providers: [

} ]我們在a中修改這個值

@inject('api') private api:object

api.value=false;

我們在b中查詢到這個值被修改了

angular11學習 十八

必須放在src assets 請使用相對路徑 以前 fg.controls name fg.controls address controls city 現在 fg.get address.city fg.get address street 禁用 fg.controls name disable ...

react原始碼探索

react核心部分為 1 虛擬dom物件 reactdom.render args,element 這個方法第乙個引數接收三種形式的內容的 第一種 字串 第二種 由createclass建立的物件,使用createelement處理 第三種 直接有createelement建立的物件 這些還未呼叫r...

MyBatis原始碼探索

每個基於 mybatis 的應用都是以乙個 sqlsessionfactory 的例項為中心的。sqlsessionfactory 的例項可以通過 sqlsessionfactorybuilder 獲得。而 sqlsessionfactorybuilder 則可以從 xml mybatis conf...