2016-07-19 23 views
1

私は数日間Webを精査しました。あなたがリダイレクト($ state.goなど)を解決でリダイレクトすると、移行が取り消され、すべての解決が再び実行されることを理解しています。UIルータの解決 - 親解決を再実行せずに子解決にリダイレクト

しかし、何らかの子供の状態にならないようにする必要がある場合はどうすればよいですか。そして、私は解決の中で、私が大して必要としないデータをフェッチします。

これは人にとって珍しいシナリオだとは思いません。誰かがアイデアを持っているなら、私はこのplnkrが働くのを手伝ってください!

http://plnkr.co/edit/gFDcRqoPXKbD1ZZwylO9?p=preview

var app = angular.module('plunker', ['ui.router']); 

app.config(['$stateProvider', function($stateProvider){ 
    $stateProvider 
    .state('posts', { 
     url: "/posts", 
     templateUrl: "posts-index.html", 
     controller: "PostsIndexController", 
     resolve: { 
     posts: function(Post) { 
      console.log('Hi'); 
      return Post.all() 
     } 
     }, 
     onEnter: function($state, posts) { 
     if (posts.length > 1 && confirm("Redirect to first post?")) { 
      console.log('Howdy') 
      // $state.go('posts.show', { postId: 3 }); 
     } 
     } 
    }) 
    .state('posts.empty', { 
     templateUrl: "posts-show.html", 
     resolve: { 
     saySomething: function($state) { 
      console.log('Yo') 
     } 
     } 
    }) 
    .state('posts.show', { 
     url: "/:postId", 
     templateUrl: "posts-show.html", 
     controller: "PostsShowController", 
     resolve: { 
     post: function($stateParams, $q, Post) { 
      console.log($stateParams); 
      return Post.find($stateParams.postId) 
     } 
     }, 
     onEnter: function($stateParams, $state) { 
     if ($stateParams.postId === '1') { 
      console.log('Now') 
      return $state.go("posts.empty") 
     } 
     } 
    }) 
}]); 

app.controller("PostsIndexController", function($scope, posts){ 
    $scope.posts = posts 
}) 

app.controller("PostsShowController", function($scope, post){ 
    $scope.post = post 
}) 

app.run(function($rootScope, $state) { 
    $rootScope.$on('$stateChangeError', function(evt, to, toParams, from, fromParams, error) { 
    console.log(to, toParams) 
    console.log(from, fromParams) 
    if (error.redirectTo) { 
     $state.transitionTo(error.redirectTo, error.redirectToParams); 
    } else { 
     // $state.go('error', {status: error.status}) 
    } 
    }) 
}) 

app.factory('Post', function(){ 
    return { 
    all: function() { 
     return [ 
     { id: 1, title: "Post 1" }, 
     { id: 2, title: "Post 2" }, 
     { id: 3, title: "Post 3" } 
     ] 
    }, 
    find: function(id) { 
     return _(this.all()).findWhere({id: +id}) 
    } 
    } 
}) 
+0

私は同じ問題を抱えています。$ state.go呼び出しで、親に 'abstract'を追加し、' notify'、 'inherit'、' reload'のすべての組み合わせを追加しようとしました。親の解決が正常に終了したかどうかは気にしないようです。すべての子が解決するようにする必要があります。そうしないと、親状態は決して「アクティブ」とはみなされません。 – Madd0g

答えて

0

私はトイレに行って、いくつかのより多くのそれについて考え、コメントを書き込みました。

解決策からそれを行う方法はないので、私の提案(そして試した後に使用している解決策)は、解決策を拒否し、それを対処しようとするのではなく、コントローラーから行うことです。$stateChangeError子状態からの "リダイレクト"を解決し、子コントローラからの実際のリダイレクトを実行するだけです。

はい、醜いですが、動作します。