Login.js:
app.controller('LoginFormController', ['$scope','$http','$rootScope', '$state', function($scope, $http, $rootScope, $state) {
$scope.user = {};
$scope.authError = null;
$scope.login = function() {
$scope.authError = null;
var emailId = $scope.user.email;
var password = $scope.user.password;
$http({
url: 'http://localhost:8090/login/login',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'email='+emailId+'&password='+password
//data: {'email': $scope.user.email, 'password': $scope.user.password}
}).then(function(response) {
console.info(response.data);
if (response.data.status == 'SUCCESS') {
$scope.user = response.data.user.firstName;
$rootScope.test = response.data.user.firstName;
console.info("check: ",$rootScope.test)
$state.go('app.dashboard');
} else {
//alert('invalid login');
$scope.authError = 'Email or Password not right';
}
}, function(x) {
$scope.authError = 'Server Error';
})
};
}])
Я сохранил значение в $ rootScope.test
Вот мой App.main.js:
'use strict';
angular.module('app').controller('AppCtrl', ['$scope','$rootScope',
function($scope, $rootScope) {
$scope.user5 = $rootScope.test;
}
]);
пытаюсь распечатать rootcope
If I run this Code i am facing the error of $rootScope is undefined in the console. How to Resolve this
Вы пробовали использовать $scope.test
в main.js?
Вместо хранения данных в $ rootScope используйте службу. $ rootScope устарел, и его использование затруднит переход на Angular 2+. См. Также AngularJS FAQ - $ rootScope существует, но его можно использовать во зло
Здесь есть полезный ответ на ваш вопрос: https://stackoverflow.com/a/18881189/9013688
Вместо того, чтобы напрямую передавать свое свойство в $ rootScope, вы можете создать событие, которое можно прослушать в другой части вашего приложения, например:
if (response.data.status == 'SUCCESS') {
$rootScope.$emit('user-logged', response.data.user.firstName)
}
А потом:
$rootScope.$on('user-logged', function(event, data){
do something with your data
})
Или вы можете использовать службу, которая является хорошим способом обработки ваших данных во всех ваших приложениях.
$broadcast
, $emit
и $on
устарели. Их использование затруднит переход на Angular 2+.
Пожалуйста, убедитесь, что вы последовали совету georgeawg
, его предложение, на мой взгляд, является лучшим способом реализации этой функции.
Я хочу подсказать, что может быть не так в вашем примере.
Если вы видите, что в основном App.main.js
вы указали объявление как
angular.module('app').controller(...
Но вы используете переменную app
в login.js
вот так.
app.controller(...
Я предполагаю, что вы создаете где-то еще. Таким образом, установленное значение rootscope
теряется из-за наличия двух экземпляров одного и того же приложения.
Решением вашей проблемы будет объявление одной переменной app
, в которой будет храниться экземпляр приложения. Таким образом, исправление для вашего решения будет заключаться в изменении App.main.js
, чтобы он был таким.
var app = angular.module('app');
app.controller(...
Также вам необходимо удалить любой другой произвольный var app =
из вашего полного кода, поскольку они создадут несколько экземпляров одного и того же приложения.
Надеюсь, мое объяснение было понятным и верным, попробуйте это решение!
В вашем основном js добавьте это.
app.run(['$rootScope', function($rootScope) {
$rootScope.test;
}]);
Вот пример реализации предложения Джорджа, который является правильным способом справиться с этим.
app.controller('LoginFormController', ['$scope','$http','$rootScope', '$state', 'stateService', function($scope, $http, $rootScope, $state, stateService) {
var userFirstName = 'John';
stateService.setFirstName('Bill');
userFirstName = stateService.getFirstName();
console.info(userFirstName); // result will be 'Bill'
}])
И сервис, который я обычно называю stateService
app.factory('stateService', [factory]);
function factory() {
var userFirstName = null;
stateService.getFirstName = function() {
return userFirstName;
};
stateService.setFirstName = function(firstName) {
userFirstName = firstName;
};
return stateService;
}
$ rootScope является родителем всей $ scope, каждая $ scope получает копию данных $ rootScope, к которым вы можете получить доступ, используя саму $ scope.
Вот модифицированная версия https://jsfiddle.net/sedhal/g08uecv5/17/
angular.module('myApp', [])
.run(function($rootScope) {
$rootScope.obj = {
"name":"user1",
"bdate":"18/11/1994",
"city":"Ahmedabad"
};
})
.controller('myCtrl', function($scope, $rootScope) {
$scope.data = $rootScope.obj;
})
.controller('myCtrl2', function($scope, $rootScope) {
$scope.data1 = $rootScope.obj;
});
Мне это пригодится @sedhal.
какой контроллер вы получаете ошибку