Не удалось обновить rootScope в angular

Я пытаюсь отправить запрос в файл php с одного контроллера в angular и получаю ответ. Я сохранил ответ в переменной rootScope, которая инициализируется в методе controller.run() значением 0.

Теперь я пытаюсь использовать обновленный rootScope в другом контроллере, чтобы отобразить ответ с php-страницы. Но rootScope не обновляется и по-прежнему показывает 0.

Вот мой код.

Ниже приведен метод запуска, в котором инициализируется rootScope.

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

Может ли кто-нибудь дать мне знать, где я ошибаюсь.


person Baradwaj Aryasomayajula    schedule 27.01.2016    source источник
comment
$rootScope.$apply(); Не требуется, дайджест запускается автоматически с http. Любые ошибки консоли? Попробуйте поместить журнал консоли в свой .run, чтобы увидеть, не перезапускается ли он в навигации?   -  person Dylan Watt    schedule 27.01.2016
comment
Я думаю, что сначала загружается ваш контроллер, а затем обновляется значение $rootScope. Вы можете показать больше намека   -  person Sandeep    schedule 27.01.2016
comment
@DylanWatt Я пробовал журналы как в методе запуска, так и в методе успеха контроллера 1. Он не показывает журнал контроллера 1. И да, метод запуска снова работает ...   -  person Baradwaj Aryasomayajula    schedule 27.01.2016
comment
@BaradwajAryasomayajula: если предложения решили вашу проблему, вы можете пометить любой ответ как принятый, который, по вашему мнению, лучше всего соответствует вашим требованиям.   -  person Pratap A.K    schedule 28.01.2016


Ответы (3)


Ваша проблема звучит как проблема времени. Для связи между контроллерами с помощью $rootScope вы можете настроить событие для прослушивания изменений.

Обновить корневую область:

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

Следите за изменениями:

$rootScope.$on('n', function (event, data) {
    //do something with new value 'data'
});
person aw04    schedule 27.01.2016
comment
причина для минуса? это было бы полезно не только мне, но и всем, кто читает этот ответ - person aw04; 28.01.2016

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.

person Pratap A.K    schedule 27.01.2016

Поместите $watch в переменную

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

Для получения дополнительной информации см. Справочник по API AngularJS $watch.


Имейте в виду, что неразумно загромождать $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();
        });
    }; 
});
person georgeawg    schedule 28.01.2016