2013-05-02 34 views
9

Sự khác biệt giữa việc triển khai hàm $ rootScope và dịch vụ là gì? An ninh khôn ngoan hoặc hiệu suất khôn ngoan.

Tôi đã đọc this, vì vậy tôi tự hỏi.

Tôi đã cố gắng tìm ra một chức năng toàn cầu nhất định cho ứng dụng của mình sẽ được triển khai tốt nhất trong dịch vụ hoặc trên chính $ rootScope. Để giới thiệu cho các bạn một ý tưởng về những gì tôi đang làm, tôi hiện đang phát triển một chức năng dạng bẩn trong đó nó nhắc người dùng nếu họ điều hướng khỏi một hình thức nhất định. Trong trường hợp này, tôi quyết định thực hiện tốt nhất nó như một chức năng toàn cầu, vì vậy bất kỳ gợi ý nào?

Cám ơn các câu trả lời,

Jan

+0

Xem: http://stackoverflow.com/a/35411623/2893073 – Eddy

Trả lời

8

Trong trường hợp này tôi sẽ đi cho một dịch vụ để tránh việc một quốc gia toàn cầu. tất cả các phạm vi mới được tạo từ $ rootScope. Bộ điều khiển mới hoặc bất kỳ ai sử dụng phạm vi sẽ có giá trị là $rootscope. Ví dụ: nếu bạn xác định $rootScope.validate() và trong bộ điều khiển, bạn xác định hàm $scope.validate() vì bạn quên định nghĩa đầu tiên, điều gì đó chắc chắn sẽ sai.

Có một bài viết của Misko H. về vấn đề này http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

Dịch vụ được instantianted theo yêu cầu, trong khi $ rootScope được tạo ra trong quá trình bootstrap, và có thể được tiêm bất cứ nơi nào bạn cần đến chúng. Điều này là tốt cho testability.

Góc sẽ không khởi tạo dịch vụ trừ khi chúng được yêu cầu trực tiếp hoặc gián tiếp bởi ứng dụng.

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

Dịch vụ nêu
3

Như @egamonal là cách mạnh mẽ hơn để chia sẻ chức năng chung. Không chỉ các dịch vụ được khởi tạo theo yêu cầu, chúng được singleton bởi tự nhiên vì vậy một khi một dịch vụ được tạo ra, cùng một ví dụ được truyền xung quanh bởi AngularJS bất cứ khi nào được yêu cầu. Vì vậy, nếu một cái gì đó có thể đi vào phạm vi gốc, nó cũng có thể được thực hiện bằng cách sử dụng một dịch vụ.

Có một suy nghĩ cần lưu ý khi sử dụng cách tiếp cận toàn cầu như vậy là khả năng rò rỉ bộ nhớ. Ví dụ về các lớp JS hoặc có thể các phần tử DOM vẫn còn trong bộ nhớ bởi vì bạn đã tham chiếu chúng từ các hàm toàn cục của bạn (hoặc trong $ rootscope hoặc dịch vụ).

+0

Điều tôi thích về rootScope mà tôi không cần phải gây rối với lời hứa. Nếu tôi có người dùng ứng dụng, tôi có thể giữ nguyên trong $ rootScope.appUser và nếu $ rootScope.appUser.firstName bị thay đổi, tôi không cần đăng ký hoặc phát ra sự kiện, tôi chỉ có thể có Firs Name: {{appUser.firstName}} trong bất kỳ chế độ xem nào. Tôi có nhớ điều gì không? – Toolkit

Các vấn đề liên quan