Angularjs 无法更新angular中的rootScope
我试图从angular中的一个控制器向php文件发送一个请求,并得到响应。我将响应存储在rootScope变量中,该变量在controller.run()方法中用0初始化 现在我尝试在另一个控制器中使用更新的rootScope,以便显示来自php页面的响应。但是rootScope没有得到更新,它仍然显示0 这是我的密码 下面是初始化rootScope的run方法Angularjs 无法更新angular中的rootScope,angularjs,angularjs-scope,angular-controller,angularjs-rootscope,Angularjs,Angularjs Scope,Angular Controller,Angularjs Rootscope,我试图从angular中的一个控制器向php文件发送一个请求,并得到响应。我将响应存储在rootScope变量中,该变量在controller.run()方法中用0初始化 现在我尝试在另一个控制器中使用更新的rootScope,以便显示来自php页面的响应。但是rootScope没有得到更新,它仍然显示0 这是我的密码 下面是初始化rootScope的run方法 adminController.run(function ($rootScope) { $rootScope.n = 0; }
adminController.run(function ($rootScope) {
$rootScope.n = 0;
});
下面是控制器1的代码,在这里我从php页面请求响应并更新rootScope变量
adminController.controller('adminLoginController', function($scope,$rootScope,$http,$window) {
$scope.loginCheck = function(event,user){
var request = $http({
method: "post",
url: "../_/php/loginCheck.php",
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
request.success(function (data) {
$rootScope.n=data;
$rootScope.$apply();
$window.location.href = 'admin.html#admin_home';
});
}
});
下面是我的第二个控制器的代码,我正在使用rootScope变量。这里出现的问题是,rootScope没有得到更新,并且只显示初始化时使用的0
adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {
$scope.uname=$rootScope.n;
alert($scope.uname);
});
谁能告诉我哪里出了问题。你的问题听起来像是时间问题。要使用
$rootScope
在控制器之间进行通信,可以设置事件以侦听更改
更新根范围:
$rootScope.$broadcast('n', data);
$rootScope.$on('n', function (event, data) {
//do something with new value 'data'
});
倾听变化:
$rootScope.$broadcast('n', data);
$rootScope.$on('n', function (event, data) {
//do something with new value 'data'
});
你的问题听起来像是时间问题。要使用
$rootScope
在控制器之间进行通信,可以设置事件以侦听更改
更新根范围:
$rootScope.$broadcast('n', data);
$rootScope.$on('n', function (event, data) {
//do something with new value 'data'
});
倾听变化:
$rootScope.$broadcast('n', data);
$rootScope.$on('n', function (event, data) {
//do something with new value 'data'
});
HTML
<body ng-app="adminController">
<div ng-controller="adminLoginController">
<button ng-click="loginCheck()">loginCheck</button>
</div>
<div ng-controller="adminHomeController">
<button ng-click="getval()">getVal</button>
rootscope val {{uname}}
</div>
</body>
如果两个控制器同时实例化,则需要使用@aw04建议的基于偶数的通知,使用$broadcaste、$on和$emit。HTML
<body ng-app="adminController">
<div ng-controller="adminLoginController">
<button ng-click="loginCheck()">loginCheck</button>
</div>
<div ng-controller="adminHomeController">
<button ng-click="getval()">getVal</button>
rootscope val {{uname}}
</div>
</body>
如果两个控制器同时实例化,则需要使用@aw04建议的基于偶数的通知,使用$broadcaste、$on和$emit。在变量上放置一个
$watch
adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {
$scope.$watch(
function watchFn(){ return $rootScope.n; },
function listener(newValue, oldValue) {
$scope.uname=newValue;
}
);
});
有关详细信息,请参阅
请记住,将
$rootScope
与数据混在一起是不明智的。持久性数据更好地保存在服务中
app.factory("LoginCheck", function($http) {
var n = 0;
var request;
function getN() { return n; };
function setN(newN) { n = newN; return n; }
function getRequest { return request; };
function check(user) {
request = $http({
method: "post",
url: "../_/php/loginCheck.php",
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
var derivedRequest = request.then(function (response) {
setN(response.data);
//return for chaining
return response;
});
request = derivedRequest;
return request;
};
return {
getN: getN,
setN: setN,
getRequest: getRequest,
check: check
};
});
然后在您的LoginController中:
adminController.controller('adminLoginController', function($scope,$window,LoginCheck) {
$scope.loginCheck = function(event,user){
var req = LoginCheck.check(user);
req.then(function (response) {
$window.location.href = 'admin.html#admin_home';
}).catch(function (errorResponse) {
console.log(errorResponse.status);
});
};
});
adminController.controller('adminHomeController', function($scope,LoginCheck) {
if ( LoginCheck.getN() ) {
$scope.uname = LoginCheck.getN();
} else {
LoginCheck.getRequest().then( function() {
$scope.uname = LoginCheck.getN();
});
};
});
在HomeController中:
adminController.controller('adminLoginController', function($scope,$window,LoginCheck) {
$scope.loginCheck = function(event,user){
var req = LoginCheck.check(user);
req.then(function (response) {
$window.location.href = 'admin.html#admin_home';
}).catch(function (errorResponse) {
console.log(errorResponse.status);
});
};
});
adminController.controller('adminHomeController', function($scope,LoginCheck) {
if ( LoginCheck.getN() ) {
$scope.uname = LoginCheck.getN();
} else {
LoginCheck.getRequest().then( function() {
$scope.uname = LoginCheck.getN();
});
};
});
在变量上放置一个
$watch
adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {
$scope.$watch(
function watchFn(){ return $rootScope.n; },
function listener(newValue, oldValue) {
$scope.uname=newValue;
}
);
});
有关详细信息,请参阅
请记住,将
$rootScope
与数据混在一起是不明智的。持久性数据更好地保存在服务中
app.factory("LoginCheck", function($http) {
var n = 0;
var request;
function getN() { return n; };
function setN(newN) { n = newN; return n; }
function getRequest { return request; };
function check(user) {
request = $http({
method: "post",
url: "../_/php/loginCheck.php",
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
var derivedRequest = request.then(function (response) {
setN(response.data);
//return for chaining
return response;
});
request = derivedRequest;
return request;
};
return {
getN: getN,
setN: setN,
getRequest: getRequest,
check: check
};
});
然后在您的LoginController中:
adminController.controller('adminLoginController', function($scope,$window,LoginCheck) {
$scope.loginCheck = function(event,user){
var req = LoginCheck.check(user);
req.then(function (response) {
$window.location.href = 'admin.html#admin_home';
}).catch(function (errorResponse) {
console.log(errorResponse.status);
});
};
});
adminController.controller('adminHomeController', function($scope,LoginCheck) {
if ( LoginCheck.getN() ) {
$scope.uname = LoginCheck.getN();
} else {
LoginCheck.getRequest().then( function() {
$scope.uname = LoginCheck.getN();
});
};
});
在HomeController中:
adminController.controller('adminLoginController', function($scope,$window,LoginCheck) {
$scope.loginCheck = function(event,user){
var req = LoginCheck.check(user);
req.then(function (response) {
$window.location.href = 'admin.html#admin_home';
}).catch(function (errorResponse) {
console.log(errorResponse.status);
});
};
});
adminController.controller('adminHomeController', function($scope,LoginCheck) {
if ( LoginCheck.getN() ) {
$scope.uname = LoginCheck.getN();
} else {
LoginCheck.getRequest().then( function() {
$scope.uname = LoginCheck.getN();
});
};
});
$rootScope.$apply()不需要代码>,摘要循环将使用http
自动运行。有控制台错误吗?尝试在中放置一个控制台日志。运行查看它是否在nav上重新运行?我认为首先加载控制器,然后更新$rootScope值。你能再给我看看吗hint@DylanWatt我尝试了控制器1的run方法和success方法中的日志。它不显示控制器1的日志。是的,run方法再次运行…@BaradwajAryasomayajula:如果建议解决了您的问题,您可以将您认为最适合您的需求的任何答案标记为已接受$rootScope.$apply()不需要代码>,摘要循环将使用http
自动运行。有控制台错误吗?尝试在中放置一个控制台日志。运行查看它是否在nav上重新运行?我认为首先加载控制器,然后更新$rootScope值。你能再给我看看吗hint@DylanWatt我尝试了控制器1的run方法和success方法中的日志。它不显示控制器1的日志。是的,run方法再次运行…@BaradwajAryasomayajula:如果这些建议解决了你的问题,你可以将你认为最适合你要求的任何答案标记为已接受。否决投票的原因是什么?这不仅对我自己有帮助,而且对任何读过这篇文章的人都有帮助。为什么投票失败?这不仅对我自己,而且对任何读过这本书的人都有帮助