无法以角度

时间:2016-01-27 15:57:09

标签: angularjs angularjs-scope angular-controller angularjs-rootscope

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

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

3 个答案:

答案 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);
        });
    };
});