Làm cách nào để sử dụng $ rootScope trong Angular để lưu trữ các biến?


217

Làm cách nào để sử dụng $rootScopeđể lưu trữ các biến trong bộ điều khiển mà tôi muốn truy cập sau này trong bộ điều khiển khác? Ví dụ:

angular.module('myApp').controller('myCtrl', function($scope) {
  var a = //something in the scope
  //put it in the root scope
});

angular.module('myApp').controller('myCtrl2', function($scope) {
  var b = //get var a from root scope somehow
  //use var b
});

Làm thế nào tôi sẽ làm điều này?


1
bạn nên tiêm $ rootScope vào bộ điều khiển và sử dụng nó như một javascript đơn giản
Ajay Beniwal

30
$ rootScope không phải là cách đúng đắn để làm điều này. Làm cho các biến có sẵn trên nhiều bộ điều khiển là khá nhiều dịch vụ dành cho.
Steve

11
@Steve: Câu hỏi thường gặp của Angular nói rằng "không tạo ra một dịch vụ với mục đích duy nhất trong cuộc sống là lưu trữ và trả lại các bit dữ liệu" Điều này sẽ gây quá nhiều tải cho chu trình $ digest ..
Marwen Trabelsi

Nếu tôi không thể đưa bộ điều khiển vào các dịch vụ, làm cách nào để gửi một biến từ dịch vụ đã nói của bạn đến bộ điều khiển khác của tôi? Tôi thấy không có cách nào để làm việc này ... đánh giá cao sự sáng suốt của bạn ở đây ..
hạ cánh

2
tốt, bởi vì nó không phải là thuốc tiêm, bạn sẽ cần một ống tiêm cho điều đó ..
Xsmael 10/11/2016

Câu trả lời:


248

Các biến được đặt ở phạm vi gốc có sẵn cho phạm vi điều khiển thông qua kế thừa nguyên mẫu.

Đây là phiên bản sửa đổi của bản demo của @ Nitish cho thấy mối quan hệ rõ ràng hơn một chút: http://jsfiddle.net/TmPk5/6/

Lưu ý rằng biến của rootScope được đặt khi mô-đun khởi tạo, và sau đó mỗi phạm vi được kế thừa sẽ có bản sao riêng có thể được đặt độc lập ( changehàm). Ngoài ra, giá trị của rootScope cũng có thể được cập nhật ( changeRshàm trong myCtrl2)

angular.module('myApp', [])
.run(function($rootScope) {
    $rootScope.test = new Date();
})
.controller('myCtrl', function($scope, $rootScope) {
  $scope.change = function() {
        $scope.test = new Date();
    };

    $scope.getOrig = function() {
        return $rootScope.test;
    };
})
.controller('myCtrl2', function($scope, $rootScope) {
    $scope.change = function() {
        $scope.test = new Date();
    };

    $scope.changeRs = function() {
        $rootScope.test = new Date();
    };

    $scope.getOrig = function() {
        return $rootScope.test;
    };
});

7
Thêm 1 cho ... uh ... thực sự trả lời câu hỏi của OP. (Mặc dù @MBielski và những người khác đều đúng).
Rap

Nếu tôi làm $scope.test = 'Some value', sự $rootScope.testthay đổi là tốt?
Allen Linatoc

@ ALLenLinatoc không, chúng sẽ không phải là hai đối tượng khác nhau mặc dù phạm vi $rootScope là toàn cầu (trên tất cả các bộ điều khiển) nhưng $scopevẫn là cục bộ của bộ điều khiển. Nếu bạn sử dụng $scope.testtrong hai bộ điều khiển khác nhau, hãy biết rằng chúng là hai biến khác nhau cho dù $rootScope.test đó là cùng một biến trong tất cả các bộ điều khiển
Xsmael

Tôi cho rằng bạn sẽ không muốn sử dụng $ rootScope thường xuyên vì lý do tương tự bạn sẽ không sử dụng các biến toàn cục trong các ngôn ngữ khác?
Zypps987

Có bao nhiêu số lượng biến gốc mà chúng ta có thể tạo trong một ứng dụng?
Jay

161

Chia sẻ dữ liệu giữa các bộ điều khiển là những gì Nhà máy / Dịch vụ rất tốt. Nói tóm lại, nó hoạt động như thế này.

var app = angular.module('myApp', []);

app.factory('items', function() {
    var items = [];
    var itemsService = {};

    itemsService.add = function(item) {
        items.push(item);
    };
    itemsService.list = function() {
        return items;
    };

    return itemsService;
});

function Ctrl1($scope,items) {
    $scope.list = items.list; 
}

function Ctrl2($scope, items) {
    $scope.add = items.add;
}

Bạn có thể thấy một ví dụ hoạt động trong fiddle này: http://jsfiddle.net/mbielski/m8saa/


49
+1 Không $rootScopenên sử dụng để chia sẻ các biến khi chúng ta có những thứ như dịch vụ và nhà máy.
jjperezaguinaga

74
Chà, Angular FAQ nói điều này ở cuối trang: "Ngược lại, đừng tạo ra một dịch vụ với mục đích duy nhất trong cuộc sống là lưu trữ và trả lại các bit dữ liệu." Xem: docs.angularjs.org/misc/faq
Oytun

11
Đây là một ví dụ đơn giản. Tôi tin rằng họ đang nói rằng không có dịch vụ chỉ xuất hiện trong một bộ điều khiển. Tôi không thể đếm được có bao nhiêu nơi mà các nhân viên đã phát triển Angular đã nói cụ thể rằng các dịch vụ là cách chính thức để truyền dữ liệu giữa các bộ điều khiển. Nhìn xung quanh danh sách gửi thư, hỏi các ngôi sao sáng khác nhau và xem những gì bạn nhận được. Tôi cũng có thể lưu ý rằng trích dẫn của bạn nằm ở cuối phần có tên "$ rootScope tồn tại, nhưng nó có thể được sử dụng cho mục đích xấu". Truyền dữ liệu từ bộ điều khiển này sang bộ điều khiển khác là xấu xa.
MBielski

1
Nhưng nếu bạn cần lặp mặc dù các mục của bạn trong hai chế độ xem / bộ điều khiển khác nhau, bạn cần sao chép dữ liệu trước trong bộ điều khiển để cung cấp cho chế độ xem? (Tôi tin rằng đây là $ rootScope đã được giải quyết)
Thomas Decaux

1
Nhà phát triển phải sử dụng phán đoán về việc nên sử dụng dịch vụ hay khắc phục nhanh rootScope, đối với một số điều, phạm vi toàn cầu là một phương tiện và tiện dụng - và tôi nghĩ đó là những gì các tài liệu Angular đang cố gắng nói. Hãy giữ nghệ thuật lập trình và không trở thành robot để MVC blah blah blah hoàn toàn. Bạn có thể sử dụng dịch vụ trên và $ xem biến nếu bạn cần một bộ điều khiển để biết về sự thay đổi tuy nhiên vì nó không thực sự giao tiếp giữa các bộ điều khiển.
hạ cánh

21
angular.module('myApp').controller('myCtrl', function($scope, $rootScope) {
   var a = //something in the scope
   //put it in the root scope
    $rootScope.test = "TEST";
 });

angular.module('myApp').controller('myCtrl2', function($scope, $rootScope) {
   var b = //get var a from root scope somehow
   //use var b

   $scope.value = $rootScope.test;
   alert($scope.value);

 //    var b = $rootScope.test;
 //  alert(b);
 });

BẢN GIỚI THIỆU


Vì vậy, trong Angular bạn không thường sử dụng var?
phân ly

1
nó phụ thuộc vào điều kiện. Nếu muốn hiển thị trong html thì bạn cần sử dụng nếu không bạn có thể sử dụng var
Nitish Kumar

Phạm vi Oh là cho công cụ DOM?
phân ly

1
Điều này có thể là muộn nhưng đối với bất kỳ máy tính đến muộn nào, phạm vi là chất kết dính giữa chế độ xem và bộ điều khiển theo tài liệu AJS. phạm vi không trực tiếp tham chiếu DOM. sau đó nó làm gì đây là tài liệu kỹ lưỡng hơn docs.angularjs.org/guide/scope
yantaq

9

tôi thấy không có lý do gì để làm điều này $ scope.value = $ rootScope.test;

$ scope đã là kế thừa nguyên mẫu từ $ rootScope.

Xin vui lòng xem ví dụ này

var app = angular.module('app',[]).run(function($rootScope){
$rootScope.userName = "Rezaul Hasan";
});

bây giờ bạn có thể liên kết biến phạm vi này ở bất kỳ đâu trong thẻ ứng dụng.


6

đầu tiên lưu trữ các giá trị trong $ rootScope dưới dạng

.run(function($rootScope){
$rootScope.myData = {name : "nikhil"}
})

.controller('myCtrl', function($scope) {
var a ="Nikhilesh";
$scope.myData.name = a;
});

.controller('myCtrl2', function($scope) {
var b = $scope.myData.name;
)}

$ rootScope là cha mẹ của tất cả $ scope, mỗi phạm vi $ nhận được một bản sao dữ liệu $ rootScope mà bạn có thể truy cập bằng chính phạm vi $.


3

Nếu nó chỉ là "truy cập trong bộ điều khiển khác" thì bạn có thể sử dụng hằng số góc cho điều đó, lợi ích là; bạn có thể thêm một số cài đặt chung hoặc những thứ khác mà bạn muốn truy cập trong suốt ứng dụng

app.constant(‘appGlobals’, {
    defaultTemplatePath: '/assets/html/template/',
    appName: 'My Awesome App'
});

và sau đó truy cập nó như:

app.controller(‘SomeController’, [‘appGlobals’, function SomeController(config) {
    console.log(appGlobals);
    console.log(‘default path’, appGlobals.defaultTemplatePath);
}]);

(không kiểm tra)

thông tin thêm: http://ilikekillnerds.com/2014/11/constants-values-global-variabled-in-angularjs-the-right-way/



1

Có nhiều cách để đạt được điều này: -

1. Thêm $rootScopevào .runphương thức

.run(function ($rootScope) {
    $rootScope.name = "Peter";
});

// Controller
.controller('myController', function ($scope,$rootScope) {
    console.log("Name in rootscope ",$rootScope.name);
    OR
    console.log("Name in scope ",$scope.name);
});

2. Tạo một dịch vụ và truy cập nó trong cả hai bộ điều khiển.

.factory('myFactory', function () {
     var object = {};

     object.users = ['John', 'James', 'Jake']; 

     return object;
})
// Controller A

.controller('ControllerA', function (myFactory) {
    console.log("In controller A ", myFactory);
})

// Controller B

.controller('ControllerB', function (myFactory) {
    console.log("In controller B ", myFactory);
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.