RootScope не работает при использовании в третьем контроллере
Я использую переменную rootScope в 3 контроллерах. Первый контроллер устанавливает значение, которое используется вторым контроллером для ng-show. Но когда я попытался управлять ng-show с третьего контроллера через ту же переменную rootScope, он не работал. "modstat" - это переменная. Я новичок в Angular. Так что, пожалуйста, помогите мне с этим. Код приведен ниже:
urlboxControllers.controller('MenuCtrl', ['$scope', '$rootScope', '$location', 'SessionService', 'AuthenticationService', 'ModalService',
function($scope, $location, $rootScope, SessionService, AuthenticationService, ModalService){
$scope.fname = JSON.parse(sessionStorage.fname);
$scope.lname = JSON.parse(sessionStorage.lname);
$scope.addLink = function() {
$rootScope.modstat = !$rootScope.modstat;
$rootScope.modserv = true;
//ModalService.set(1);
};
$scope.logout = function() {
AuthenticationService.logout().success(function() {
$location.path('/login');
});
};
}]);
urlboxControllers.controller('ModalCtrl', ['$scope', '$rootScope', '$location', 'SessionService', 'ModalService',
function($scope, $location, $rootScope, SessionService, ModalService){
$scope.grid = {};
$scope.grid.uid = JSON.parse(sessionStorage.id);
$scope.modserv = function() {
return $rootScope.modserv;
};
if($scope.modserv){
$scope.mtitle= "Create a Link";
}
else if(!$scope.modserv){
$scope.mtitle= "Update Link";
}
$scope.statcheck = function() {
console.log("stat" + $rootScope.modstat);
return $rootScope.modstat;
};
$scope.icons = [{ico: 'cloud'}, {ico: 'envelope'}, {ico: 'pencil'}, {ico: 'search'}, {ico: 'heart'}, {ico: 'star'},
{ico: 'user'}, {ico: 'home'}, {ico: 'cog'}, {ico: 'file'}, {ico: 'time'}, {ico: 'download-alt'}, {ico: 'download'},
{ico: 'upload'}, {ico: 'lock'}, {ico: 'play-circle'}, {ico: 'tag'}, {ico: 'tags'}, {ico: 'book'}, {ico: 'bookmark'},
{ico: 'print'}, {ico: 'map-marker'}, {ico: 'tint'}, {ico: 'edit'}, {ico: 'share'}, {ico: 'plus-sign'},
{ico: 'minus-sign'}, {ico: 'ok-sign'}, {ico: 'info-sign'}, {ico: 'leaf'}, {ico: 'fire'}, {ico: 'calendar'},
{ico: 'comment'}, {ico: 'folder-close'}, {ico: 'hdd'}, {ico: 'bullhorn'}, {ico: 'bell'}, {ico: 'certificate'},
{ico: 'wrench'}, {ico: 'globe'}, {ico: 'tasks'}, {ico: 'filter'}, {ico: 'briefcase'}, {ico: 'link'},
{ico: 'paperclip'}, {ico: 'pushpin'}, {ico: 'log-in'}, {ico: 'flash'}, {ico: 'log-out'}, {ico: 'save'}, {ico: 'open'},
{ico: 'saved'}, {ico: 'send'}, {ico: 'floppy-disk'}, {ico: 'floppy-saved'}, {ico: 'tower'}, {ico: 'stats'},
{ico: 'cloud-download'}, {ico: 'cloud-upload'}, {ico: 'tree-conifer'}, {ico: 'tree-deciduous'} ];
$scope.create = function(){
if($scope.modserv) {
$scope.repo = ModalService.mvalidate($scope.grid);
if($scope.repo.stat === 'error'){
$scope.errcol = $scope.repo;
}
else if($scope.repo.stat === 'success'){
$scope.errcol = $scope.repo;
ModalService.create($scope.grid).success(function(data) {
if(data='Saved')
{
$scope.grid = {};
$scope.succ = '<div class="alert alert-success" role="alert">Saved</div>';
$rootScope.modstat = false;
}
else {
alert(data.error);
}
});
}
}
};
}]);
urlboxControllers.controller('GridCtrl', ['$scope', '$location', 'SessionService', 'GridService', '$rootScope',
function($scope, $location, SessionService, GridService, $rootScope){
$scope.uid = JSON.parse(sessionStorage.id);
GridService.gdata($scope.uid).success(function(data) {
$scope.grids=data;
});
$('#gridmod').on('hidden.bs.modal', function (e) {
GridService.gdata($scope.uid).success(function(data) {
$scope.grids=data;
});
});
$scope.getLocation = function() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition($scope.showPosition);
} else {
console.log("Geolocation is not supported by this browser.");
}
};
$scope.showPosition = function (position) {
$scope.lat = position.coords.latitude;
$scope.lng = position.coords.longitude;
GridService.weather($scope.lat, $scope.lng).success(function(data) {
$scope.wdata = data;
$scope.weather = $scope.wdata.weather;
$scope.main = $scope.wdata.main;
$scope.conv = 273.15;
$scope.temp = $scope.main.temp - $scope.conv;
$scope.code = $scope.weather[0].icon.slice(0,-1);
});
};
$scope.getLocation();
$scope.upLink = function(lid) {
//$rootScope.modstat = !$rootScope.modstat;
console.log("test" + $rootScope.modstat);
$rootScope.modserv = true;
};
$scope.delLink = function(lid) {
console.log(lid);
};
}]);
2 ответа
При настройке объектов для вставки в функцию они должны располагаться в том же порядке, в каком вы указали в массиве. Ваш пример ->
urlboxControllers.controller('MenuCtrl', ['$scope', '$rootScope', '$location', 'SessionService', 'AuthenticationService', 'ModalService',
function($scope, $location, $rootScope, SessionService, AuthenticationService, ModalService){}
должно быть
urlboxControllers.controller('MenuCtrl', ['$scope', '$rootScope', '$location', 'SessionService', 'AuthenticationService', 'ModalService',
function($scope, $rootScope, $location, SessionService, AuthenticationService, ModalService){}
Я думаю, что проблема связана со вторым контроллером.
Объявление контроллера второго имеет $location
а также $rootScope
аргументы инвертированы в знаке функции. Вы используете это:
urlboxControllers.controller('ModalCtrl', ['$scope', '$rootScope', '$location', 'SessionService', 'ModalService',
function($scope, $location, $rootScope, SessionService, ModalService){
вместо:
urlboxControllers.controller('ModalCtrl', ['$scope', '$rootScope', '$location', 'SessionService', 'ModalService',
function($scope, $rootScope, $location, SessionService, ModalService){
Во втором контроллере вы устанавливаете атрибут в $location
объект (вот почему вы не получаете никакой ошибки), а затем он извлекается через $rootScope