Angularjs 如何在没有可用解析的情况下确定.Others()上的默认URL

Angularjs 如何在没有可用解析的情况下确定.Others()上的默认URL,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我正在尝试使用规则函数设置.otherwise(),以确定默认URL。我无法注入状态或读取路径,因为应用程序尚未加载,我真正需要做的是类似于在.other()中解析的操作,以检查我的UserService并ping服务器进行会话,因为我的UserService.isLoggedIn未定义。如果您确实需要解析之类的东西,您如何处理不同的默认URL?您可以在其他函数中调用您的函数isLogged 但是。。。问题是,您不能将您的服务UserService注入到您的配置函数中(我假设有一点),因为它既不

我正在尝试使用规则函数设置.otherwise(),以确定默认URL。我无法注入状态或读取路径,因为应用程序尚未加载,我真正需要做的是类似于在.other()中解析的操作,以检查我的UserService并ping服务器进行会话,因为我的UserService.isLoggedIn未定义。如果您确实需要解析之类的东西,您如何处理不同的默认URL?

您可以在其他函数中调用您的函数isLogged

但是。。。问题是,您不能将您的服务UserService注入到您的配置函数中(我假设有一点),因为它既不是常量,也不是提供者

您可以在一个常数中调用日志进程,该常数返回一个承诺,如resolve函数:

.constant('login', function(){

  var access = function(UserService){
     return $q.when('start').then(function(){
       return UserService.initSession(); // I suppose you have a similar function
     })
  }

  access.$inject = ['UserService'];

  return access;
})
.config([..., 'login',
...
 $urlRouterProvider.otherwise(function() {
     login();
  ...
在配置函数中:

.constant('login', function(){

  var access = function(UserService){
     return $q.when('start').then(function(){
       return UserService.initSession(); // I suppose you have a similar function
     })
  }

  access.$inject = ['UserService'];

  return access;
})
.config([..., 'login',
...
 $urlRouterProvider.otherwise(function() {
     login();
  ...

看看官方文件中的示例:.$urlRouterProvider#方法#否则

  // Example of using function rule as param
  $urlRouterProvider.otherwise(function ($injector, $location) {
    return '/a/valid/url';
  });
您有
$injector
$location
,因此您可以找到您需要的任何东西。如果需要,您甚至可以将其封装在易于阅读的可注入函数中:

function myOtherwiseFunction($state, UserService, Whatever) { 
  // check some $state stuff
  if ($state.current) { /* blah */ }
  // check some Whatever stuff
  if (Whatever.myFancyLogic()) { /* blah */ }

  if (UserService.isLoggedIn()) 
    return "/app";
  else 
    return "/login";
}

$urlRouterProvider.otherwise(function ($injector, $location) {
  return $injector.invoke(myOtherwiseFunction);
});

您能否共享该场景的示例代码,以帮助更好地理解该问题?假设UserService需要首先运行$http请求,以确保在路由到的过程中。否则()成功地实现了承诺,因为它将异步执行,而不是使用类似于resolve()的东西,所以这在您的示例中不是有缺陷的吗在仪表板或登录之间进行路由之前,确保承诺得到履行和成功。正确。否则是同步的。我不知道。否则是同步的,所以我可以像决心一样对待它并回报承诺?谢谢,很高兴知道。不,它是同步的,这意味着函数的返回结果在退出函数后立即使用。它不处理异步承诺。啊,明白了,抱歉。是否可以创建一条用于处理其他问题的路线?例如说.otherwise(“/”),然后have.state('default',{url:'/',…),resolve({isAuth:['$http',function($http){……return promise;}]);