Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 无法更新angular中的rootScope_Angularjs_Angularjs Scope_Angular Controller_Angularjs Rootscope - Fatal编程技术网

Angularjs 无法更新angular中的rootScope

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

我试图从angular中的一个控制器向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);
});

谁能告诉我哪里出了问题。

你的问题听起来像是时间问题。要使用
$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:如果这些建议解决了你的问题,你可以将你认为最适合你要求的任何答案标记为已接受。否决投票的原因是什么?这不仅对我自己有帮助,而且对任何读过这篇文章的人都有帮助。为什么投票失败?这不仅对我自己,而且对任何读过这本书的人都有帮助