angularjs中的factory瓶珊,service與provider的區(qū)別

在Angular中,控制器應(yīng)該是簡(jiǎn)潔精煉的耸彪;一些邏輯和重復(fù)性的數(shù)據(jù)都應(yīng)該要存儲(chǔ)到服務(wù)中伞芹。控制器就應(yīng)該在需要他們的時(shí)候?qū)嵗跄龋诓恍枰臅r(shí)候就取消掉唱较。因此,Angular在你每次切換路由的時(shí)候蜀肘,就會(huì)清理當(dāng)前的控制器绊汹。但是呢,服務(wù)為我們提供了一種長(zhǎng)期存儲(chǔ)應(yīng)用數(shù)據(jù)的方式扮宠,同時(shí)西乖,也可以在不同的控制器之間統(tǒng)一的使用服務(wù)。

Angular為我們提供了三種創(chuàng)建服務(wù)的方式:

  • Factory
  • Service
  • Provider

廢話不多說(shuō)坛增,簡(jiǎn)要分析一下获雕。

factory新創(chuàng)建了一個(gè)對(duì)象,然后在這個(gè)對(duì)象上新添屬性收捣,最后返回這個(gè)對(duì)象届案。
service使用new關(guān)鍵詞進(jìn)行了實(shí)例化。只需要在this上添加屬性和方法罢艾,服務(wù)就會(huì)自動(dòng)的返回this楣颠。

factory與service在controller的用法并沒(méi)有什么不同尽纽,不要以為service每次注入controller都要new一次,AngularJS 在初始化的時(shí)候童漩,會(huì)new一次service,所以當(dāng) controller 要求注入 service 的時(shí)候弄贿,AngularJS 就會(huì)把已經(jīng) new 過(guò)的的 service 給 controller。

注意:Provider 都是 singleton !!!!!

沒(méi)錯(cuò)矫膨,所以就算 service 有 new 這個(gè)指令差凹,可是其實(shí)也只是做一次而已。
每個(gè)要求注入 service 的 components 拿到的都會(huì)是同一個(gè)service reference侧馅。
factory 也是相同的情況危尿,全部系統(tǒng)共用一個(gè) Factory reference。

所以我們才用Provider做controller之間傳值的橋梁D俪铡R杲俊!

Provider:

provider是唯一一種可以創(chuàng)建用來(lái)注入到config()函數(shù)的服務(wù)的方式罗晕。想在你的服務(wù)啟動(dòng)之前邮绿,進(jìn)行一些模塊化的配置的話,就使用provider攀例。

來(lái)簡(jiǎn)單的說(shuō)明一下 Provider 跟 Factory 和 Service 的關(guān)系。個(gè)人覺(jué)得 Mark Meyer 在 top 10 mistakes angularjs developers make 文章解說(shuō)的很好顾腊。把 code 借來(lái)并附上我的注解粤铭。

// factory  的底層就是回傳 provider 的 $get 裡的值 
function factory(name, factoryFn) {
     return provider(name, { $get: factoryFn });
}

// service  的底層就是在 factory 裡使用 $jnjector.instantiate 跟 construct 建立新物件
// ( $injector.instantiate 會(huì)做 new instance 的動(dòng)作)
function service(name, constructor) {
     return factory(name, ['$injector',
          function($injector) {
               return $injector.instantiate(constructor);
          }]);
}

再來(lái)看看provider的使用方式:

app.provider('My', function () {
        //  私有屬性和方法
        var artist;

        // 只有直接添加在this上的屬性才能被config函數(shù)訪問(wèn)
        this._artist = '';
        this.thingFromConfig = '';

        // 只有$get函數(shù)返回的屬性才能被控制器訪問(wèn)
        this.$get = function () {
            var that = this;
            return {
                getArtist: function () {
                    return that._artist;
                },
                thingFromConfig: that.thingFromConfig
            };
        };
    })
    .config(['MyProvider', function ( MyProvider ) {
        MyProvider.thingFromConfig = 'this is set in config()';
    }])
    .controller('myProviderCtrl', [
        '$scope', 'My',
        function ( $scope, My ) {
            $scope.artist = My.thingFromConfig;
        }]);

你可以認(rèn)為provider有三個(gè)部分,第一部分是私有變量和私有函數(shù)杂靶,這些變量和函數(shù)會(huì)在以后被修改梆惯。第二部分是在app.config函數(shù)里可以訪問(wèn)的變量和函數(shù),所以吗垮,他們可以在在其他地方使用之前被修改垛吗。注意,這些變量和函數(shù)一定要添加到this上面才行烁登。在我們的例子中怯屉,app.config()函數(shù)能夠修改的只有thingFromConfig。第三部分是在控制器里可以訪問(wèn)的變量和函數(shù)饵沧。

當(dāng)使用 provider創(chuàng)建服務(wù)的時(shí)候锨络,唯一可以讓控制器訪問(wèn)的屬性和方法是在$get()函數(shù)里返回的屬性和方法。將$get添加到了this上面狼牺,最終這個(gè)函數(shù)會(huì)被返回羡儿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市是钥,隨后出現(xiàn)的幾起案子掠归,更是在濱河造成了極大的恐慌缅叠,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虏冻,死亡現(xiàn)場(chǎng)離奇詭異肤粱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)兄旬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)狼犯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人领铐,你說(shuō)我怎么就攤上這事悯森。” “怎么了绪撵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵瓢姻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我音诈,道長(zhǎng)幻碱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任细溅,我火速辦了婚禮褥傍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喇聊。我一直安慰自己恍风,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布誓篱。 她就那樣靜靜地躺著朋贬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窜骄。 梳的紋絲不亂的頭發(fā)上锦募,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音邻遏,去河邊找鬼糠亩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛党远,可吹牛的內(nèi)容都是我干的削解。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沟娱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼氛驮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起济似,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矫废,失蹤者是張志新(化名)和其女友劉穎盏缤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蓖扑,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唉铜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了律杠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潭流。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柜去,靈堂內(nèi)的尸體忽然破棺而出灰嫉,到底是詐尸還是另有隱情,我是刑警寧澤嗓奢,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布讼撒,位于F島的核電站,受9級(jí)特大地震影響股耽,放射性物質(zhì)發(fā)生泄漏根盒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一物蝙、第九天 我趴在偏房一處隱蔽的房頂上張望炎滞。 院中可真熱鬧,春花似錦诬乞、人聲如沸厂榛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辈双,卻和暖如春责掏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背湃望。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工换衬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人证芭。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓瞳浦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親废士。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叫潦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1、angularjs的幾大特性是什么官硝? 雙向數(shù)據(jù)綁定矗蕊、依賴注入短蜕、模板、指令傻咖、MVC/MVVM 2朋魔、列舉幾種常見(jiàn)的...
    2e9a10d418ab閱讀 1,276評(píng)論 0 10
  • Angular面試題 一、ng-show/ng-hide與ng-if的區(qū)別卿操? 第一點(diǎn)區(qū)別是警检,ng-if在后面表達(dá)式...
    w_zhuan閱讀 5,533評(píng)論 0 26
  • 1、angularjs的幾大特性是什么害淤? 雙向數(shù)據(jù)綁定扇雕、依賴注入、模板筝家、指令洼裤、MVC/MVVM 2、列舉幾種常見(jiàn)的...
    秀才JaneBook閱讀 1,545評(píng)論 0 22
  • ng-model 指令ng-model 指令 綁定 HTML 元素 到應(yīng)用程序數(shù)據(jù)溪王。ng-model 指令也可以:...
    壬萬(wàn)er閱讀 875評(píng)論 0 2
  • AngularJSAngularJS 是一個(gè) MV* 框架腮鞍, 最適于開(kāi)發(fā)客戶端的單頁(yè)面應(yīng)用。它不是個(gè)功能庫(kù)莹菱,...
    一直以來(lái)都很好閱讀 900評(píng)論 0 0