摘要:共享數(shù)據(jù)的最佳策略是什么呢用一些{{BANNED}}的控制器繼承方案嗎當(dāng)然不是,最簡單容易的方式就是使用服務(wù)。概括創(chuàng)建一個服務(wù)去存放你的數(shù)據(jù),并給數(shù)據(jù)創(chuàng)建和的方法。
原文鏈接 : Sharing Data Between Controllers? Best Practice: Use a Service
原文作者 : DAVE CEDDIA
譯者 : 李林璞(web前端領(lǐng)域)
譯者注:翻譯如有疏漏,歡迎指出!感謝!轉(zhuǎn)載請保留此頭部。
Angular開始起來簡單易用,甚至說神奇。“哇哦!雙向綁定!”
你會迫不及待地去構(gòu)建你的杰作,直到碰到釘子:你正在像網(wǎng)上每個人建議的那樣去構(gòu)建一個獨立的組件,但怎么和其他組件共享數(shù)據(jù)呢?
或許你在不同的路由里有兩個視圖都需要訪問某些狀態(tài)變量,又或者你有三個分離的組件需要訪問同樣的一堆數(shù)據(jù)。
共享數(shù)據(jù)的最佳策略是什么呢?用一些{{BANNED}}的控制器繼承方案嗎?
當(dāng)然不是,最簡單容易的方式就是使用服務(wù)(service)。
問題假設(shè)有兩個并排的面板,每個面板代表一個指令(directive):
下面是面板1的代碼:
angular.directive("paneOne", function() { return { restrict: "E", scope: {}, template: [ "", "", "", "" ].join(""), controllerAs: "p1", controller: function() { var vm = this; vm.text = ""; vm.addToList = function() { // TODO: add to the list in Pane 2 somehow vm.text = ""; }; } }; });
面板2的:
angular.directive("paneTwo", function() { return { restrict: "E", scope: {}, template: [ "
我們想要實現(xiàn)的是在面板1的輸入框中輸入某些東西,然后點擊按鈕 “Add To List”, 這條內(nèi)容就會在面板2的列表中出現(xiàn)。
創(chuàng)建一個服務(wù)保持共享狀態(tài)為了在兩個甚至更多的控制器間共享數(shù)據(jù),創(chuàng)建一個服務(wù)去扮演中間件的角色。這樣可以使控制器(或組件)保持松散耦合:它們不需要知道其他的控制器(或組件)是怎么樣的,它們只需要知道數(shù)據(jù)源 - 你創(chuàng)建的中間件服務(wù)。
angular.factory("sharedList", function() { var list = []; return { addItem: addItem, getList: getList }; function addItem(item) { list.push(item); } function getList() { return list; } });
上面這個服務(wù)非常簡單,調(diào)用 addItem 把數(shù)據(jù)放到列表里,然后調(diào)用 getList 獲取整個列表。這真的很簡單,甚至不需要去移除或者清空列表項,看到這個方法的簡便之處了吧。
在任何需要的地方注入服務(wù)既然我們已經(jīng)創(chuàng)建好了我們的服務(wù),我們就需要在任何需要訪問或修改數(shù)據(jù)的地方去注入它了。
先從面板1的控制器開始:
// Inject sharedList controller: function(sharedList) { var vm = this; vm.text = ""; vm.addToList = function() { // Stuff the item into the shared list sharedList.addItem(vm.text); vm.text = ""; }; }
然后是面板2的控制器,獲取數(shù)據(jù):
// Inject sharedList controller: function(sharedList) { var vm = this; // Read the data vm.listItems = sharedList.getList(); }
從JSBin里看看運行情況。
但不需要觀察器(watchers)嗎?當(dāng)我寫到這兒的時候,我非常確定面板2中的列表在我添加一些觀察器前不會自動更新 。
但是接下來當(dāng)我把代碼放到 JSBin 里的時候...你瞧,它竟然可以更新!為什么呢?
ng-repeat 給循環(huán)的數(shù)組設(shè)置了觀察器。
點擊 “Add To List” 觸發(fā)了一個消化周期 (digest cycle),它就會重新檢測 ng-repeat 的觀察器。
因為 sharedData.getList() 返回了一個數(shù)組的引用,觀察器就會看到 p2.listItems 已經(jīng)發(fā)生了變化。這里是關(guān)鍵:如果 getList 返回一個不同于由 addToList 更改的數(shù)組,這就不會觸發(fā)更新了。
所以:這種通信方式可以在沒有觀察器的情況下完美運行。但如果你發(fā)現(xiàn)失敗了的話,檢查一下你是怎么傳遞數(shù)據(jù)的,或許你需要明確地創(chuàng)建一個觀察器檢測變化。
概括創(chuàng)建一個服務(wù)去存放你的數(shù)據(jù),并給數(shù)據(jù)創(chuàng)建 getter 和 setter 的方法。
在任何需要這個數(shù)據(jù)的地方注入這個服務(wù)。
這幾乎就是全部內(nèi)容了(除非你需要觀察器 - 這種情況下,你還是添加一個吧)。
感謝閱讀!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86400.html
摘要:為應(yīng)用增加新的特性和處理新的情況可能都會改變文件的結(jié)構(gòu)。寫一個模板的最佳實踐是,不要在模板中處理數(shù)據(jù)。在上面這四個文件夾中,主要的測試代碼將是單元測試,這意味著你需要將被測試的代碼與應(yīng)用分離開來。 前言 Node和Express并不嚴(yán)格要求它的應(yīng)用的文件結(jié)構(gòu)。你可以以任意的結(jié)構(gòu)來組織你的web應(yīng)用。這對于小應(yīng)用來說,通常是不錯的,十分易于學(xué)習(xí)和實驗。 但是,當(dāng)你的應(yīng)用在體積和復(fù)雜性上都...
摘要:框架最佳實踐最佳實踐在設(shè)計良好的應(yīng)用中,控制器很精練,包含的操作代碼簡短如果你的控制器很復(fù)雜,通常意味著需要重構(gòu),轉(zhuǎn)移一些代碼到其他類中。層業(yè)務(wù)邏輯層框架由,,組成,執(zhí)行流程一般是在訪問獲取數(shù)據(jù),通過渲染頁面。 Yii2.0框架 MVC 最佳實踐 Controller最佳實踐 在設(shè)計良好的應(yīng)用中,控制器很精練,包含的操作代碼簡短; 如果你的控制器很復(fù)雜,通常意味著需要重構(gòu), 轉(zhuǎn)移一些代...
摘要:可能會延長這些的壽命假設(shè)你有以下的這個緩存了和如果命中了緩存,就從緩存中取,否則發(fā)起網(wǎng)絡(luò)請求如果我們更改了,我們會修改中的版本號,觸發(fā)的更新。 本文翻譯自:https://jakearchibald.com/201...這是一篇2016年的老文章。作者是Chrome瀏覽器的開發(fā)成員。 本文首發(fā)于公眾號:符合預(yù)期的CoyPan 使用正確的緩存可以帶來巨大的頁面性能上的收益,節(jié)省帶寬,減...
摘要:來源是最流行的用于開發(fā)微服務(wù)的框架。以下依次列出了最佳實踐,排名不分先后。這非常有助于避免可怕的地獄。推薦使用構(gòu)造函數(shù)注入這一條實踐來自的項目負(fù)責(zé)人。保持業(yè)務(wù)邏輯免受代碼侵入的一種方法是使用構(gòu)造函數(shù)注入。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/R3InYSAIZkHQ40ly9Oztiart2lESCyjCH0JwFRp3oErlYobhibM...
摘要:今天的文章由來自的和撰寫,在不同用戶案例中搜集到的數(shù)據(jù)基礎(chǔ)上,描述了的安全最佳實踐。在谷歌上,我們的用來部署我們的服務(wù)。實施連續(xù)安全缺陷掃描容器可能包含過時的已知缺陷的程序包。谷歌云平臺的用戶能夠從自動防火墻規(guī)則中受益,避免跨集群交流。 今天的文章由來自 Aqua Security 的 Amir Jerbl 和 Micheal Chemy 撰寫,在不同用戶案例中搜集到的數(shù)據(jù)基礎(chǔ)上,描述...
閱讀 2850·2023-04-26 02:23
閱讀 1602·2021-11-11 16:55
閱讀 3161·2021-10-19 11:47
閱讀 3375·2021-09-22 15:15
閱讀 1989·2019-08-30 15:55
閱讀 1050·2019-08-29 15:43
閱讀 1306·2019-08-29 13:16
閱讀 2206·2019-08-29 12:38