web-dev-qa-db-ja.com

Angular UI-Router $ urlRouterProvider .when <a ui-sref="...">をクリックしても機能しないとき

angular Webアプリ)に.when('/center', '/center/question')があります。

ブラウザで'/center'と入力すると、期待どおり'/center/question'にリダイレクトされますが、<a ui-sref="center" href="#/center"></a>をクリックすると、リダイレクトされず、URL '/center'のままになります。

コンソールにエラーはなく、理由はわかりません。

同様の問題が1つあります Angular UI-Router $ urlRouterProvider .when not workinganymore 。私のために働かないでください。

私のcoffeescriptコードは次のとおりです。

whenConfig = ['$urlRouterProvider', ($urlRouterProvider) ->
  # default url config

  $urlRouterProvider
  .otherwise '/center'
  .when '/center', '/center/question'
]

stateConfig = ['$stateProvider', ($stateProvider) ->
  # nested url config

  capitalize = (s)->
    s[0].toUpperCase() + s[1..]

  mainConfig = ({
    name: name
    url: "/#{name}"
    templateUrl: "templates/#{name}.html"
    controller: "#{capitalize name}Ctrl"
  } for name in ['center', 'keywordList', 'keywordConfig', 'log', 'stat'])

  centerConfig = ({
    name: "center.#{name}"
    url: "/#{name}?page"
    templateUrl: "templates/center/#{name}.html"
    controller: "Center#{capitalize name}Ctrl"
  resolve:
    thead: (CenterService) ->
      CenterService.getThead @self.name
    data: (CenterService, $stateParams) ->
      CenterService.fetchItems @self.name, $stateParams.page
  } for name in ['question', 'answer', 'comment', 'article'])

  for singleConfig in mainConfig
    $stateProvider.state singleConfig

  for childConfig in centerConfig
    $stateProvider.state childConfig
]

app.config whenConfig
app.config stateConfig
17
J22Melody

新しい作業プランカーAngular UI-Router $ urlRouterProvider .when not not ** more *、バージョンで動作するはずです_0.2.13+_

以前のソリューション

バージョン_0.2.12-_までは、ドキュメントで提案されている$urlRouterProvider.when()を使用できます(小さな引用)

方法:デフォルト/インデックスの子状態を設定する

...
'parent.index' URLを空にしない場合は、$ urlRouterProviderを使用してmodule.configでリダイレクトを設定します。

_ $urlRouterProvider.when('/home', '/home/index');
_

したがって、これは上記の Q&A に示されたソリューションでした。

_var whenConfig = ['$urlRouterProvider', function($urlRouterProvider) {

    $urlRouterProvider
      .when('/app/list', ['$state', 'myService', function ($state, myService) {
            $state.go('app.list.detail', {id: myService.Params.id});
    }])
    .otherwise('/app');
}];
...
app.config(whenConfig) 
_

今-私たちはできません。

_0.2.13_のUIルーター「FIX」

これは、リリースに記載されている「FIX」(これは単にわかりません)によるものです .2.1

バグ修正
$ state:
-...
-.transitionTo( b267ecd 、closes #157 )の後のURLからの再同期を避ける

そして、これが rlRouter.jsに追加された新しいコード です:

_if (lastPushedUrl && $location.url() === lastPushedUrl)
 // this line stops the corrent .when to work
 return lastPushedUrl = undefined;

lastPushedUrl = undefined;
_

このコードは他の問題を最適化/修正しています...しかし、.when()機能

解決

すでに述べたように、このまったく新しい plunker はバージョン0.2.13+での方法を示しています。状態の変化をリッスンする必要があります。状態が「app.list」の場合、IDを指定して詳細に移動できます...

_var onChangeConfig = ['$rootScope', '$state',
 function ($rootScope, $state) {

  $rootScope.$on('$stateChangeStart', function (event, toState) {    
    if (toState.name === "app.list") { 
      event.preventDefault();
      $state.go('app.list.detail', {id: 2});
    }
  });

}]
_

plunker here を確認してください

20
Radim Köhler

コントローラーでもこれを行うことができます。状態の変化を聞くよりもきれいだと思います。

例:

.controller 'YourControllerName', ($scope, $state) ->
    $state.go "center.question" if $state.is "center"
2
Roi