我正在尝试从一个控制器以角度发送请求到php文件并获得响应。我将响应存储在rootScope变量中,该变量在controller.run()方法中初始化为0。
现在我正在尝试在另一个控制器中使用更新的rootScope,以便显示来自php页面的响应。但是rootScope没有得到更新,它仍然显示为0。
这是我的代码。
以下是初始化rootScope的run方法
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);
});
有人可以让我知道我哪里出错了。
答案 0 :(得分:2)
您的问题听起来像是时间问题。要在具有$rootScope
的控制器之间进行通信,您可以设置一个事件来监听更改。
更新根范围:
$rootScope.$broadcast('n', data);
倾听变化:
$rootScope.$on('n', function (event, data) {
//do something with new value 'data'
});
答案 1 :(得分:1)
<强> HTML 强>
find
<强>控制器强>
<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建议的基于偶数的通知。
答案 2 :(得分:1)
在变量上加SELECT id, firstname, lastname, email
FROM users
WHERE id not in (
SELECT user_id
FROM user_category
WHERE category_id IN (280, 210, 177, 207, 240, 157, 187, 246, 153, 208, 199, 156, 281, 211, 212, 220, 218, 170, 201, 222, 236, 233)
)
$watch
有关详细信息,请参阅AngularJS $watch API Reference
请记住,将adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {
$scope.$watch(
function watchFn(){ return $rootScope.n; },
function listener(newValue, oldValue) {
$scope.uname=newValue;
}
);
});
与数据混为一谈并不明智。持久数据最好保留在服务中。
$rootScope
然后在你的LoginController中:
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
};
});
在你的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);
});
};
});