AngularJS에서 UI-Router를 사용하여 상태를 기본 하위 상태로 리디렉션


89

일부 데이터를 표시하는 탭 기반 페이지를 만들고 있습니다. AngularJs에서 UI-Router를 사용하여 상태를 등록하고 있습니다.

내 목표는 페이지로드시 하나의 기본 탭을 여는 것입니다. 각 탭에는 하위 탭이 있으며 탭을 변경할 때 기본 하위 탭을 열고 싶습니다.

나는 onEnter함수 로 테스트하고 있었고 내부에서 사용하고 $state.go('mainstate.substate');있지만 루프 효과 문제로 인해 작동하지 않는 것 같습니다 (state.go에서 하위 상태로 이동하여 부모 상태를 호출하고 루프로 바뀜).

$stateProvider

.state('main', {
  url: '/main',
  templateUrl: 'main.html',
  onEnter: function($state) {
    $state.go('main.street');
  }
})

.state('main.street', {
  url: '/street',
  templateUrl: 'submenu.html',
  params: {tabName: 'street'}
})

여기에 플 런커 데모를 만들었습니다 .

지금은 기본 탭이 열려 있지 않고 정확히 필요한 것 외에는 모든 것이 작동합니다.

귀하의 제안, 의견 및 아이디어에 감사드립니다.

답변:


172

업데이트 : 1.0 이후 기본적으로 redirectTo를 지원합니다.

https://ui-router.github.io/ng1/docs/latest/interfaces/state.statedeclaration.html#redirectto


여기에 예제를 만들었습니다 .

이 솔루션은 리디렉션에 문제 사용에 좋은 "코멘트"에서 유래 .when() ( https://stackoverflow.com/a/27131114/1679310 )그것을 위해 정말 멋진 솔루션 (크리스 T에 의해하지만 원래의 게시물은 yahyaKacem로했다)

https://github.com/angular-ui/ui-router/issues/1584#issuecomment-75137373

따라서 먼저 리디렉션 설정으로 main을 확장 해 보겠습니다.

$stateProvider
    .state('main', {
      url: '/main',
      templateUrl: 'main.html',
      redirectTo: 'main.street',
    })

그리고이 몇 줄만 실행에 추가하십시오.

app.run(['$rootScope', '$state', function($rootScope, $state) {

    $rootScope.$on('$stateChangeStart', function(evt, to, params) {
      if (to.redirectTo) {
        evt.preventDefault();
        $state.go(to.redirectTo, params, {location: 'replace'})
      }
    });
}]);

이렇게하면 기본 리디렉션으로 상태를 조정할 수 있습니다. 여기에서 확인 하세요.

편집 : 브라우저 기록을 보존하기 위해 @Alec의 주석 옵션이 추가되었습니다.


4
이것은 뒤로 버튼을 방해하는 것 같습니다.
Scott Sword

6
@ Swordfish0321을 사용하여 뒤로 버튼을 수정하고이 작은 변경을 수행합니다. $state.go(to.redirectTo, params, {location: 'replace'});이렇게하면 새 상태가 기록의 이전 상태 (예 : 리디렉션되는 상태)를 대체합니다. $ state.go에 대한 문서를 참조하십시오 : angular-ui.github.io/ui-router/site/#/api/...
알렉

2
이것이 제가하고 싶은 일에 매우 가깝다는 것을 덧붙이고 싶었지만, 대체하는 대신 기본 URL을 원했습니다. 이것은 다음으로 변경 '$stateChangeStart'하여 쉽게 수행 할 수 있습니다'$stateChangeSuccess'
Matti Price

6
ui-router 1.0 은이
Gert-Jan

21

사실 Radim 이 제안한이 솔루션이 이 이 정확히 작동하더라도 모든 탭의 하위 탭 (상태)을 기억해야했습니다.

그래서 동일한 작업을 수행하지만 모든 탭 하위 상태를 기억하는 또 다른 솔루션을 찾았습니다.

내가해야 할 일은 ui-router-extras 를 설치 하고 깊은 상태 리디렉션 기능을 사용하는 것입니다 .

$stateProvider
  .state('main.street', {
     url: '/main/street',
     templateUrl: 'main.html',
     deepStateRedirect: { default: { state: 'main.street.cloud' } },
  });

감사합니다!


12

현재 버전 1.0 인터페이스 라우터의 그것이 지원하는 redirectTo속성. 예를 들면 :

.state('A', {
  redirectTo: 'A.B'
})

7

버전 1.0 UI 라우터 때문에, 기본 고리가 도입 된 사용 IHookRegistry.onBefore () 의 예에서 입증 된 바와 같이이 데이터는 기본 서브 상태를 기반 으로 http://angular-ui.github.io/ui-router/feature-1.0/ interface / transition.ihookregistry.html # onbefore

// state declaration
{
  name: 'home',
  template: '<div ui-view/>',
  defaultSubstate: 'home.dashboard'
}

var criteria = {
  to: function(state) {
    return state.defaultSubstate != null;
  }
}
$transitions.onBefore(criteria, function($transition$, $state) {
  return $state.target($transition$.to().defaultSubstate);
});

저를 위해 이런 종류의 작업을 수행했지만 조정해야했습니다 (ES6도 사용)$transitions.onBefore({ to: state => state.defaultSubstate != null }, trans => trans.router.stateService.target(trans.to().defaultSubstate));
yorch

3
app.config(function($stateProvider,$urlRouterProvider){

    $urlRouterProvider.when("/state","/state/sub-state");

    })

1
이것이 무엇을하고 이미 존재하는 답변보다 나은 이유에 대한 설명을 제공 할 수 있습니까?
Equalsk

이 솔루션은 가장 쉽고 잘 작동했습니다.
BuffMcBigHuge

이것은 지금까지 최고의 답변입니다. 변경 이벤트를 사용하는 것보다 더 간결합니다. 패키지를 추가 할 필요가 없습니다. 나는 그것이 누구에게도 명확하지 않은 방법을 모릅니다. 수락 된 답변이 어떻게 그렇게 많이 찬성되었는지 모르겠습니다.
CodeWarrior

1

누군가가 상태에 대한 간단한 리디렉션을 구현하는 방법에 대한 답변을 얻기 위해 여기에 오면 나에게 일어난 것처럼 새 라우터를 사용할 기회가 없습니다.

분명히 다시 할 수 있다면 @bblackwo 대답이 좋습니다.

$stateProvider.state('A', {
  redirectTo: 'B',
});

할 수 없다면 수동으로 리디렉션하십시오.

$stateProvider.state('A', {
  controller: $state => {
    $state.go('B');
  },
});

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.