为什么当目标状态或其父级通过 Promise 解析时 $state.go 不起作用

2024-04-08

我尝试使用解析加载父状态上的一些数据,并在应用程序运行时将用户重定向到默认状态,如下所示:

app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {

  $stateProvider.state('home', {
    url: '/',
    template: '<div><a ui-sref="home">Start App</a> <a ui-sref="home.main">Home</a> <a ui-sref="home.other">Other state</a><div ui-view>Loading...</div></div>',
    resolve: {
      user: ['$timeout', '$q', 
        function($timeout, $q) {
          var deferred = $q.defer();
          var promise = deferred.promise;
          var resolvedVal = promise.then(function() {
            console.log('$timeout executed');
            return {Id: 12, email: '[email protected] /cdn-cgi/l/email-protection', name: 'some name'};
          }, function() {
            console.log('Error happend');
          });
          $timeout(function() {
            deferred.resolve();
          }, 2000);
          return resolvedVal;
        }]
      //user: function() {return {id: 222, name: 'testname', email: '[email protected] /cdn-cgi/l/email-protection'}; }
    },
    controller: ['$scope', 'user', function($scope, user) {
      $scope.user = user;
    }]
  });

  $stateProvider.state('home.other', {
    url: 'other',
    template: '<div>Your name is {{user.name}}, and email is {{user.email}}</div><div>This is other state of application, I try to make it open as default when application starts, by calling to $state.transitionTo() function in app.run() method</div>',
    resolve: {
      someObj: function() {
        console.log('hello');
        return {someProp: 'someValue'};
      }  
    },
    controller: ['$scope', 'user', function($scope, user) {
      $scope.user = user;
    }]    
  });

}]);  

app.run(['$state', '$rootScope', function ($state, $rootScope) {
  $state.go('home.other');   
}]);

并且这不会改变地址栏中的 url,也不会显示 home.other 状态的模板(尽管执行了 home.state 的解析函数并且控制台中有“hello”)。 但是,当我在解析中评论 Promise 函数时,而是将简单的函数返回对象应用程序按预期重定向。

另外,尝试执行 $http 请求而不是 $timeout ,该请求实际上会在那里,但也没有运气。


并回答我自己的问题 - 由于摘要循环在调用 $state.go('home.other') 后开始处理请求的 url,并且当解析函数创建延迟对象时,发生了不需要的行为,尽管该对象已解析,状态引擎已经传递到请求的 url 的状态。因此,为了防止这种情况,我使用了下面解释的技术:

如果您需要在应用程序启动时在某些情况下放弃执行请求的 url 的状态解析,您可以使用 $stateChangeStart 事件,如下所示:

app.run(['$state', '$rootScope', '$timeout', function ($state, $rootScope, $timeout) {
  var appStarted = 0; // flag to redirect only once when app is started
  $rootScope.$on('$stateChangeStart', 
  function(event, toState, toParams, fromState, fromParams) { 
    if(appStarted) return;
    appStarted = 1;   
    event.preventDefault(); //prevents from resolving requested url
    $state.go('home.other'); //redirects to 'home.other' state url
  });  
}]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么当目标状态或其父级通过 Promise 解析时 $state.go 不起作用 的相关文章

随机推荐