Javascript AngularJS UI路由器0.X在初始应用程序加载时发出获取要触发的if语句

Javascript AngularJS UI路由器0.X在初始应用程序加载时发出获取要触发的if语句,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,JS: 参考最后一条if/else语句: 如果当前路由名称不在数组中,则只需隐藏/显示元素。它工作得很好,但它不会在初始应用程序加载时运行。示例: 在应隐藏元素的页面上打开应用程序,但会显示该元素 在同一页上刷新,元素仍然显示 导航到另一个页面,它就能完美地工作 如何使这个特定的if/else语句每次运行时都不会出错,即使在页面刷新时也是如此 旁注:我必须以这种方式动态执行,因为所讨论的元素是通过JS依赖项动态插入的。您是否通过控制台日志或断点来查看这是否在重新加载页面时运行?这是在运行块还

JS:

参考最后一条if/else语句:

如果当前路由名称不在数组中,则只需隐藏/显示元素。它工作得很好,但它不会在初始应用程序加载时运行。示例:

  • 在应隐藏元素的页面上打开应用程序,但会显示该元素
  • 在同一页上刷新,元素仍然显示
  • 导航到另一个页面,它就能完美地工作
如何使这个特定的if/else语句每次运行时都不会出错,即使在页面刷新时也是如此


旁注:我必须以这种方式动态执行,因为所讨论的元素是通过JS依赖项动态插入的。

您是否通过控制台日志或断点来查看这是否在重新加载页面时运行?这是在运行块还是配置块中,或者两者都不在?您是否尝试过对第二条if语句使用
$stateChangeSuccess
?当触发
$stateChangeStart
时,DOM元素甚至不应该存在,因此它在导航时工作的事实有点令人惊讶。这段代码包含在哪里?如果在重新加载时触发
$stateChangeStart
之前未定义观察程序,它显然不会捕获事件。如果要避免状态可见,请向解析函数返回拒绝的承诺,以中止状态模板的加载。使用
document.querySelector
是一个大问题的症状。
app.run(['$rootScope', '$http', '$state', 'segment',
function run($rootScope, $http, $state, segment) {

  let publicStates = [
    'register',
    'forgotPassword',
    'passwordreset',
    'login',
  ];

  // Add JWT token as default auth header.
  $http.defaults.headers.common.Authorization = 'Bearer ' +
  window.localStorage.getItem('userToken');

  // Check that user is logged in.
  $rootScope.$on('$stateChangeStart', function(event, toState) {

    $rootScope.$state = toState;

    if (!window.localStorage.getItem('userToken') &&
        publicStates.indexOf(toState.name) === -1) {
      event.preventDefault();
      $state.go('login');
    }

    if (publicStates.indexOf(toState.name) === -1) {
      angular.element(document.querySelector('#gs')).css('visibility', 'visible');
    } else {
      angular.element(document.querySelector('#gs')).css('visibility', 'hidden');
    }
  });

  $rootScope.$on('$stateChangeSuccess',
  function(event, toState, toParams, fromState) {
    segment.page(toState.name, {
      path: toState.name,
      referrer: fromState.url,
      url: toState.url,
    });
  });
}]);