当前位置: 代码迷 >> JavaScript >> $ window重置我的服务
  详细解决方案

$ window重置我的服务

热度:26   发布时间:2023-06-12 14:21:43.0

我正在使用Angular创建一个登录页面。 在后端处理完登录后,我从LoginCtrl设置MyService的值,然后使用$window.location.href= 'main.jsp';移至下一页$window.location.href= 'main.jsp'; 但是,当我从HomeCtrl调用在LoginCtrl中设置的值时,这些值是否为空?

我知道服务是单例,并且将在整个应用程序中保持相同的状态。 但是在这种情况下,它会重置。 我认为这是因为使用$ window.location.href。 请帮助我解决我的问题。

这是我的服务(MyService):

app.service('MyService', function() {
    var user = {
        name: '',
        permissions: ''
    };

    this.getUser = function() {
        return user;
    }

    this.setUser = function(userr) {
        this.user = userr;
    }
});

这是我的LoginCtrl :(我刚刚发布了http.post部分)

$http({
                method: 'POST',
                url: 'login',
                data: JSON.stringify($scope.user),
                headers: {
                    'Content-Type': 'application/json'
                }
            }).success(function(data) {
                if (!("failure" == data)) {
                    console.log(data);
                    var user = MyService.getUser();
                    user.name = data.name;
                    user.permissions = data.permissions;
                    console.log(user);
                    console.log(MyService.getUser());

                     $window.location.href = 'main.jsp';
                    // MyService.changeLocation('main.jsp', true);
                } else {
                    $scope.information = "Invalid username/password!"
                }
            }).error(function(data) {
                console.log(data);
            });

这是我的HomeCtrl:

app.controller('HomeCtrl', function($scope, $http,MyService) {

    console.log(MyService.getUser());
    var user = MyService.getUser();
    $scope.flashMessage="Hello " + user.name;
});

这里的user.name为空。

您正在更改网页。 角度应用程序不会在网站范围内持续存在; 删除对window.location.href的更改。

为了模拟Angular中的页面更改,请考虑使用官方路由器(Angular 1.4+附带),ngRoute或Angular UI Router。 这些解决方案使用“ HTML历史记录Api”和“后备广告”到hashbang URL来模拟您要实现的目标。

最终创建了一个单页应用程序,这是Angular设计的。

在LoginCtrl中,在到达success回调时,您没有在MyService服务中将响应值(本例中的data )设置为user对象。

您正在通过以下方式从“服务”获取user对象

var user = MyService.getUser();

但是,将值设置为该对象将不会在服务中设置用户对象。

您需要使用MyService.getUser(user); 设置服务中的值, HomeCtrl中将提供相同的HomeCtrl

    $http({
            method: 'POST',
            url: 'login',
            data: JSON.stringify($scope.user),
            headers: {
                'Content-Type': 'application/json'
            }
        }).success(function(data) {
            if (!("failure" == data)) {
                console.log(data);
                var user= {};
                user.name = data.name;
                user.permissions = data.permissions;
                MyService.getUser(user);  //set the values for user 
                var obj= MyService.getUser();   //get the values for user

                console.log(obj);   
               //should display user object 
               //with respective name and permissions should be available

                console.log(MyService.getUser());

                 $window.location.href = 'main.jsp';
                // MyService.changeLocation('main.jsp', true);
            } else {
                $scope.information = "Invalid username/password!"
            }
        }).error(function(data) {
            console.log(data);
        });

更新:

您的代码似乎不起作用的原因是:您错误地使用了$ window来更改路由。 $window.location.href = 'main.html'正在某种程度上更改了angular上下文之外的路线 ,因此未运行HomeCtrl 要解决此问题,您需要执行以下操作:

  • 首先,为您的角度应用程序定义路由(最好使用 )

      app.config(function($stateProvider){ $stateProvider .state('login',{ url:'/', templateUrl:'login.html', controller:'LoginCtrl' }) .state('main',{ url:'/main', templateUrl:'main.html', controller:'HomeCtrl' }) .state("otherwise", { url : '/'}) }) 
  • 使用$location.url('/main') 注意,它与我们为state: main定义的url模式相同。 或者更好的是,您应该使用$state.go('home'); 将用户重定向到理想状态

这是一个工作的

希望这可以帮助!

  相关解决方案