Как использовать $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/
Ответ 7
http://astutejs.blogspot.in/2015/07/angularjs-what-is-rootscope.html
app.controller('AppCtrl2', function ($scope, $rootScope) {
$scope.msg = 'SCOPE';
$rootScope.name = 'ROOT SCOPE';
});
Ответ 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);
})