【问题标题】:Losing value when redirecting pages重定向页面时失去价值
【发布时间】:2015-12-16 18:51:13
【问题描述】:

我有登录表单,当用户输入有效的用户名和密码时,他被重定向到主页。我在会话中保留用户名和密码,但是当我转到主页并尝试从 sessionservice 中调用 console.log geUser() 函数时,我得到了 null....

你可以在下面看到我的代码。

应用配置

   (function () {

            'use strict';
            angular.module('chatApp', ['ui.router','ngAnimate','ui.bootstrap','ui.bootstrap.modal'])
                .config(function ($stateProvider, $urlRouterProvider) {

                    $urlRouterProvider.otherwise("/login");

                    $stateProvider
                        .state('login', {
                            url: '/login',
                            templateUrl: 'src/user/login/login.tpl.html',
                            controller: 'loginController'
                        })
                        .state('home', {
                            url: '/home',
                            templateUrl: 'src/home/home.tpl.html',
                            controller: 'homeController'

                        })
                });
        })();

登录控制器

/**
 * Created by user on 15.09.2015.
 */
(function () {
    'use strict';
    function LoginController($scope, loginService, redirectService,sessionService) {
        $scope.loginController = {};



        $scope.loginController.user = {

            username: '',
            password: ''
        };

        $scope.loginController.message = "";
        $scope.loginController.hasError = false;

        $scope.loginController.login = function () {
            var promise = loginService.login($scope.loginController.user);
            promise.then(function (data) {

                    sessionService.setUser(data);
                    redirectService.loginToHome();
                },
                function (data) {
                    $scope.loginController.message = "Username or password is incorrect";
                    $scope.loginController.hasError = true;
                });
        };

    }

    angular.module('chatApp').controller('loginController', LoginController);
})();

登录模板

<div class="modal-dialog">
    <div class="loginmodal-container">
        <h1>Login</h1><br>

        <form name="form" novalidate>
            <div class="input-group">
                <label for="user">Username </label>
                <input ng-model="loginController.user.username" id="user" name="user" type="text" class="form-control"
                       placeholder="Username = Bukic"
                       aria-describedby="basic-addon1" required/>
                <br/>

                <div ng-show="form.$submitted || form.user.$touched">
                    <div ng-show="form.user.$error.required">Username is required</div>
                </div>
            </div>
            <div class="input-group">
                <label for="pass">Password </label>
                <input ng-model="loginController.user.password" id="pass" name="pass" type="password"
                       class="form-control"
                       placeholder="Password = bukic"
                       aria-describedby="basic-addon1" required>
                <br/>

                <div ng-show="form.$submitted || form.pass.$touched">
                    <div ng-show="form.pass.$error.required">Password is required</div>
                </div>
            </div>
            <br/>
            <input type="submit" class="login loginmodal-submit" ng-click="loginController.login()"
                   ng-disabled="form.$invalid" name="login" value="Login">
        </form>
        <br/>

        <div class="alert alert-danger" ng-show="loginController.hasError">{{loginController.message}}</div>
    </div>
</div>

登录服务

/**
 * Created by user on 15.09.2015.
 */
(function () {
    'use strict';
    angular.module('chatApp').factory('loginService', function ($q) {
        var service = {};
        service.login = function (user) {
            var deferred = $q.defer();

            if (user.username === 'Bukic' && user.password === 'bukic') {
                deferred.resolve(user);
            }
            else {
                deferred.reject({success: false});
            }

            return deferred.promise;
        };
        return service;
    });
})();

会话服务

/**
 * Created by user on 15.09.2015.
 */
(function () {
    'use strict';
    angular.module('chatApp').factory('sessionService', function () {
        var service = {};
        var user = null;
        service.getUser = function () {
            console.log(user.username);
            return user;
        };
        service.setUser = function (user) {
            this.user = user;
           // console.log(user);
        };
        service.isAuthenticated = function () {
            return this.user !== null;
        };
        return service;
    });
})();

重定向服务

/**
 * Created by user on 15.09.2015.
 */
(function () {
    'use strict';
    angular.module('chatApp').factory('redirectService', function ($state) {
        var service = {};
        service.loginToHome = function () {

            $state.go('home',{reload:false});
        };

        service.loginToLogin = function(){
            $state.go('login');
        };
        return service;
    });
})();

家庭控制器

(函数(){

'use strict';
function HomeController($scope,redirectService,sessionService) {

    $scope.homeController = {};

    //$scope.homeController.checkuser = sessionService.getUser();
  //  console.log("Home Controller" + $scope.homeController.checkuser);


}


angular.module('chatApp').controller('homeController', HomeController);

})();

【问题讨论】:

    标签: javascript html angularjs


    【解决方案1】:

    我会说你的服务可能是这样的:

    /**
     * Created by user on 15.09.2015.
     */
    (function () {
        'use strict';
        angular.module('chatApp').factory('sessionService', function () {
            // define the variable user as property
            var service = {
               user: null
            };
            service.getUser = function () {
                //console.log(user.username);
                return this.user;
            };
            service.setUser = function (user) {
                this.user = user;
               // console.log(user);
            };
            service.isAuthenticated = function () {
                return this.user !== null;
            };
            return service;
        });
    })();
    

    getUser 总是返回 null,因为 setUser 从不将值赋给最初被赋空值的变量 user。

    【讨论】:

    • tnx 男人!还有一个问题。我正在使用引导模式来制作弹出窗口。在那个弹出窗口中,我也从会话中带走了这个用户,但我仍然得到空值......所以当我使用模式时是否可以重新加载页面或其他东西??
    • 如果没有代码,很难猜出哪里出了问题,但可能根本不需要重新加载页面。我会问另一个问题;)
    • 是的,我应该粘贴一些代码。这是链接paste.ofcode.org/5GPPqwwBx8zmUZqUFhNNyN。我收到错误:无法读取 null 的属性“用户名”。我也尝试像上面的家庭控制器一样从服务中获取会话,但也出现错误......
    【解决方案2】:

    它应该是 return this.user 在您的 sessionService 的获取用户功能中,而不是返回用户。

    否则你会得到控制台错误:Uncaught ReferenceError: Uncaught ReferenceError: user is not defined

    service.getUser = function () {
                console.log(user.username);
                return this.user;
            };
    

    【讨论】:

    • 小心。但是以这种方式 isAuthenticated 不再按预期工作。因为如果 setUser 从未被调用过,则 user 是未定义的,因此突然经过身份验证(未定义!== null 为真)。
    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 2015-08-10
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多