关于$state监听
发布于 2年前 作者 erguotou520 2535 次浏览 来自 问答

之前的一部分小坑已爬过,但前面还是有不少坑在等着我 1.我想在APP启动前先读取数据库内容,判断是否已登录,如果未登录显示登录页面,如果已登录跳至首页,这段逻辑应该写在哪?我现在写在app.js里面的,如下

$rootScope.$on('$stateChangeStart', function (event, next) {
    if (!$rootScope.site && next.name !== '' && next.name !== 'init') {
      $location.path('/init');
    }
  });

但是发现$stateChangeStart这个事件会一直触发,导致下面这个错误 加载慢 如果监听$stateChangeSuccess这个事件,那么就会显示一部分页面然后再跳转。我觉得这样做是不是有点不正确?如果要实现一开始我描述的那样,是不是应该先显示splashscreen然后再配置angular? 2.如果登录后取消返回键返回到登录页面的情况应该怎么做? 3.关于页面跳转,UI-ROUTER里面有个方法是$state.go,但是我就算写成$state.go('app.xx',null,{location:true}或者{location:"replace"}地址栏的地址都是有时变有时不变,很奇怪。我现在改用$location.path了。 4.ng-include似乎在真机上会错误?我使用的是<div ng-include="'templates/xxx.html'"></div>,在chrome上是没有问题的

9 回复

1.逻辑写在 run 方法里可以吧? 2.我是直接跳转到登录页,$location.url(‘/login’); 3.$location.url(‘/login’);呢? 4.这个就不太清楚了,还没用过ng-include

我后来重新构思了下应用的结构,把登录页面改成模态框,确实规避了很多问题,监听事件还是改成了$stateChangeSuccessng-include用其它方法规避了,跳转还是老老实实地用$location.path()

你可以通过路由来判断是否有这种权限

            .state('account', {
                url: "/account",
                abstract: true,
                templateUrl: "templates/account.html",
                //进行验证
                resolve: {
                    validater: function () {
                       //验证代码,可以做些简单的验证
                    }
                }
            })

@zxj963577494 有详细点的demo不?我在进行验证后,在进行判断时没有得到resolve返回的数据

@yf0311 可以直接在validater方法中做出判断,为何要获取resolve返回数据,如果要进入某个controller前预加载一些数据。可以使用$q,如下:

resolve: {
                    InitData: function ($http, $q) {
                            var deferred = $q.defer(); // 声明延后执行,表示要去监控后面的执行
                            url = "xxxxx";
                            $http.get(url).success(function (data) {
                                    deferred.resolve(data); //声明执行成功,即http请求数据成功,可以返回数据了
                                }
                            )
                            return deferred.promise; //返回承诺,这里并不是最终数据,而是访问最终数据的API
                        }
                    }
                }

1、我的理解:数据库应该是本地数据库,那可以在默认路由$urlRouterProvider.otherwise进行判断是否已经登录,从而跳转到不同的页面; 2、不明白意思; 3、$state.go只是路由的跳转,而$location.path和$window.location.href是会重新加载页面的吧; 4、真机上会报错,要贴出错误日志来,不然不知道是什么问题

@zhanyz $location不会重新加载,$window会重新加载

@zxj963577494 是嘛,忘记了,thx

@zxj963577494 谢谢,虽然还是我想要的。希望有实用性的demo像ngnice样

回到顶部