Как использовать $rootScope в Angular для хранения переменных?

Как использовать $rootScope для хранения переменных в контроллере, который я хочу получить позже, на другом контроллере? Например:

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
});

Как мне это сделать?

Ответ 1

Переменные, установленные в корневой области, доступны для области управления через прототипическое наследование.

Здесь представлена ​​модифицированная версия демонстрации @Nitish, которая показывает отношения немного яснее: http://jsfiddle.net/TmPk5/6/

Обратите внимание, что переменная rootScope устанавливается, когда модуль инициализируется, и затем каждая из наследуемых областей получает свою собственную копию, которая может быть установлена ​​независимо (функция change). Кроме того, значение rootScope также может быть обновлено (функция changeRs в 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;
    };
});

Ответ 2

Обмен данными между контроллерами - это то, для чего очень важны Фабрики/Сервисы. Короче говоря, он работает примерно так.

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;
}

В этой скрипте вы можете увидеть рабочий пример: http://jsfiddle.net/mbielski/m8saa/

Ответ 3

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);
 });

DEMO

Ответ 4

Я не нахожу причины делать это $scope.value = $rootScope.test;

$scope уже является наследованием прототипа из $rootScope.

См. этот пример

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

теперь вы можете привязать эту переменную области видимости в любом месте тега приложения.

Ответ 5

сначала сохраните значения в $rootScope как

.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 является родителем для всей области $scope, каждая область $получает копию данных $rootScope, к которой вы можете получить доступ, используя сам объем $.

Ответ 6

Если это просто "доступ в другом контроллере", вы можете использовать константы angular для этого, это преимущество; вы можете добавить некоторые глобальные настройки или другие вещи, к которым вы хотите получить доступ во всем приложении

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

а затем выполните следующие действия:

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

(не тестировалось)

Дополнительная информация: http://ilikekillnerds.com/2014/11/constants-values-global-variables-in-angularjs-the-right-way/

Ответ 8

Существует несколько способов достижения этой цели: -

1. Добавить $rootScope в .run метод

.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. Создайте одну службу и получите доступ к ней в обоих контроллерах.

.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);
})