1

我正在尝试从一个控制器以角度向 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);
});

有人可以让我知道我哪里出错了。

4

3 回答 3

3

您的问题听起来像是时间问题。要在控制器之间进行通信$rootScope,您可以设置一个事件来监听更改。

更新根范围:

$rootScope.$broadcast('n', data);

监听变化:

$rootScope.$on('n', function (event, data) {
    //do something with new value 'data'
});
于 2016-01-27T16:08:52.960 回答
1

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>

控制器

var app = angular.module('adminController', []);

app.run(function ($rootScope) {
    alert("run");
    $rootScope.n = 0;
});

adminController.controller('adminLoginController', function($scope,$rootScope,$http,$window) {

    $scope.loginCheck = function(){
        alert("Inside loginCheck");
        $rootScope.n = 1;      
    }
});

adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {

    $scope.getval = function() {
        $scope.uname = $rootScope.n;
    } 
});

如果您的两个控制器同时实例化,那么您需要使用 @aw04 建议的基于偶数的通知,使用 $broadcaste、$on 和 $emit。

于 2016-01-27T17:13:53.170 回答
1

将 a$watch放在变量上

adminController.controller('adminHomeController', function($scope,$rootScope,$http,$window) {
    $scope.$watch(
        function watchFn(){ return $rootScope.n; },
        function listener(newValue, oldValue) {
            $scope.uname=newValue;
        }
    );
});

有关更多信息,请参阅AngularJS $watch API 参考


$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);
        });
    };
});

在您的 HomeController 中:

adminController.controller('adminHomeController', function($scope,LoginCheck) {
    if ( LoginCheck.getN() ) {
        $scope.uname = LoginCheck.getN();
    } else {
        LoginCheck.getRequest().then( function() {
            $scope.uname = LoginCheck.getN();
        });
    }; 
});
于 2016-01-28T01:52:51.117 回答