2013-05-02 66 views
9

實現$ rootScope函數和服務之間有什麼區別?安全明智或性能明智。我已閱讀this,所以我想知道。

我一直在試圖弄清楚我的應用程序的某個全局函數是否最好在服務或$ rootScope本身中實現。爲了向大家介紹我正在做什麼,我正在開發一個骯髒的表單功能,在該功能中,如果用戶離開某個表單,它會提示用戶。在這種情況下,我決定把它作爲一個全局函數來實現,所以有什麼提示?

感謝您的答覆,

+0

請參閱:http://stackoverflow.com/a/35411623/2893073 – Eddy 2016-09-09 04:17:11

回答

8

在這種情況下,我會去服務,以避免全球性的狀態。所有新的作用域都是從$ rootScope創建的。新的控制器或使用範圍的人員的值將爲$rootscope。例如,如果您定義了$rootScope.validate(),並且在控制器中定義了函數$scope.validate(),因爲您忘記了第一個定義,則肯定會出錯。

有出自MISKO H.這個http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

服務一篇關於需求的instantianted,而引導過程中創建$ rootScope,何地您需要他們可以注射。這對測試性很好。

Angular不會實例化服務,除非它們是由應用程序直接或間接請求的。

http://docs.angularjs.org/guide/dev_guide.services.creating_services

3

由於@egamonal提到的服務是分享共同的功能更強大的方式。不僅服務按需實例化,它們本質上是單一的,所以一旦創建了服務,相同的實例就會在需要時由AngularJS傳遞。因此,如果某些事情可以在root作用域上運行,那麼它也可以使用服務來實現。

一個想到要記住使用這種全局方法是內存泄漏的可能性。 JS類的實例或可能的DOM元素保留在內存中,因爲您已從全局函數(在$ rootcope或service中引用它們)引用它們。

+0

我喜歡rootScope,我不需要混淆承諾。如果我有應用程序的用戶,我可以保持在$ rootScope.appUser的下襬,如果$ rootScope.appUser.firstName被更改,我不需要訂閱或發佈事件,我可以只有Firs名稱:{{appUser.firstName}}任何視圖。我想念什麼? – Toolkit 2015-11-27 08:42:36