2013-11-20 2 views
21

다음 사례가 있습니다. AngularJS 응용 프로그램에서 라우팅에 ui-router를 사용하고 있습니다. 한 경로에는 여러 하위 화면에 대해 다섯 개의 하위 상태가 있습니다. 나는 회전 목마와 같은 방식으로 이들 사이의 전환을 애니메이션으로 만들고 싶다.경로 변경을위한 두 개의 다른 애니메이션

탐색은 다음과 같습니다

왼쪽 밖으로 screen A 슬라이드 및 오른쪽에서 screen B 슬라이드를해야 state A state B까지 탐색
Link to A | Link to B | Link to C | Link to D | Link to E 

; 그 반대의 경우는 state B에서 state A까지입니다. 작업은 방향으로 enterleavetransform: translateX(...);로 화면 전환 애니메이션입니다 무엇을

.

보통 깃발이 달린 ng-class을 사용하여 내 애니메이션을 제어합니다. 그러나이 경우, ui-view 요소의 클래스 설정은 전혀 작동하지 않습니다 (각도 1.2 및 ui-router 0.2는 아직 완전히 호환되지 않습니다). 또한 전환이 시작된 후 해고되는 scope.$on "$stateChangeStart"을 경청하는 사용자 정의 지시문으로 설정하는 것도 아닙니다.

원하는 동작을 어떻게 구현할 수 있습니까?

편집 : 기록을위한 솔루션

: 나는 경로를 변경하기 전에 방향을 결정하기 위해 $state.go()를 사용하여 사용자 정의 $scope 기능을 사용하여 구현 끝났다. 이렇게하면 $digest already in progress 오류가 발생하지 않습니다. 애니메이션을 결정하는 클래스는 ui-view의 부모 요소에 추가됩니다. 이것은 현재뿐만 아니라 미래도 ui-view 올바른 방향으로 움직입니다.

컨트롤러 기능 (커피 스크립트) :

go: (entry) -> 
    fromIdx = ... 
    toIdx = ... 

    if fromIdx > toIdx 
    $scope.back = false 
    else 
    $scope.back = true 

    $state.go entry 

템플릿 :

<div ng-class="{toLeft: back}"> 
    <div ui-view></div> 
</div> 
+0

ng-animate의 자바 스크립트 기반 애니메이션 변형을 사용할 수 있습니까? 여기서 애니메이션을 적용 할 위치를 확인하고 방향에 따라 다른 애니메이션을 적용 할 수 있습니까? – kontur

+0

@kontur : 구현 방법을 알고 있다면 자유롭게 답을 추가하십시오 :). –

답변

26

당신은 특별히 그렇게 컨트롤러를 설정하여보기에 클래스를 제어 할 수 있습니다. 그런 다음 앱에서 이벤트를 구독하고 페이지가 움직이는 방식을 변경할 수 있습니다. 내가 UI를 사용 했어주의하시기 바랍니다이 작업을 수행하려고 사람은 여기 http://codepen.io/ed_conolly/pen/aubKf

보여주기 위해 codepen을 설정 한

.controller('viewCtrl', function ($scope) { 
    $scope.$on('$stateChangeSuccess', function (event, toState) { 
     if (toState.name === 'state1') { 
      $scope.back = true; 
     } else { 
      $scope.back = false; 
     } 
    }); 
}); 

컨트롤러 내에서 다음

<div class="viewWrap" ng-controller="viewCtrl"> 
    <div class="container" ui-view ng-class="{back: back}"></div> 
</div> 

.router.compat 모듈은 Angular 1.2 및 UI Router의 애니메이션의 현재 비 호환성 때문에 발생합니다.

+0

좋은 답변입니다. 나는 이것을보고 있었고 또 다른 접근법이'$ locationChangeStart'를 사용할 지 궁금합니다. 멋진 코데펜 +1. –

+1

네가 할 수있는 - locationChange는 ngRoute이고 질문은 특히 ui 라우터를 사용하는 것에 관한 것입니다. '성공 '을 사용하면 시스템이 그 시점에서 경로 변경을 수락 했으므로 유용합니다. – eddiec

+0

답변 해 주셔서 감사합니다. 그러나 이것이 내 문제를 제거하지는 못합니다. '$ digest already in progress' 메시지를 항상 얻습니다. 게다가, 제거 될 ui-view는 새로운 뷰가 다른 뷰를 얻는 동안 오래된 클래스를 유지한다. 이렇게하면 떠나보기가 잘못된 방향으로 움직이는 반면에 들어오는 모습은 왼쪽으로 튀어 나오는 올바른 방향으로 움직이는 아주 이상한 효과를냅니다. –

3

항상 angular-1.2 분기를 체크 아웃 할 수 있습니다 : https://github.com/angular-ui/ui-router/tree/angular-1.2. 이것은 ngAnimate를 몇 가지 다른 것들과 함께 수정합니다.

이 내용은 ui-router 0.3에 포함될 것입니다.0이므로 라이브를 곧 진행하지 않는 한 'stable'브랜치로 돌아올 때까지 필요한 기능을 제공해야합니다.

면책 조항 : 나는 UI 라우터의 다음 릴리스시기 또는 포함될 내용에 대한 권한이 없습니다. 나는 단순히 github 페이지의 다양한 문제에서이 정보를 발견했습니다.

+0

답변 해 주셔서 감사합니다. 나는 이미 그것을 시도하고 불행히도 내 문제를 해결하지 못했습니다. –

1

Eddiec의 솔루션은 정말 좋은 시작 이었지만 여전히 약간 해킹 당했다. 여기에 내 목적에 맞게 작동하는 수정 된 컨트롤러가 있습니다. 이것은 더 역동적이다 : 나는 ngRoute$routeChangeSuccess를 사용하지만 우연히 문제가 다이제스트주기가 실행되기 전에 ng-leave 애니메이션을 시작할 것이라고했다으로이 같은 일을 시도했습니다

function ViewCtrl($scope, $state) { 

    $scope.$on('$stateChangeStart', function (event, toState) { 
     var movingToParent = $state.includes(toState.name); 
     if (movingToParent) { 
      $scope.back = true; 
     } else { 
      $scope.back = false; 
     } 
    }); 


} 
1

. 입력 애니메이션은 항상 정확했지만 휴가 애니메이션은 항상 이전 애니메이션이었습니다.

나를 위해 일한 해결책 (각도 1.57)은 에 $location.path() 전화를 래핑하는 것이 었습니다. 이렇게하면 애니메이션이 시작되기 전에 전체 다이제스트가 실행됩니다.

function goto(path) { 
    if(nextIndex > currentIndex) { 
     ctrl.transition = 'slide-out-left'; 
    } else { 
     ctrl.transition = 'slide-out-right'; 
    } 
    $timeout(function() { 
     $location.path(path); 
    }); 
    } 
0

@ eddiec의 허용 된 답변과 비슷한 시도입니다. 기본적으로 상태 이름 값의 배열과 toState 및 fromState 값의 이름 배열의 위치가 비교되어 방향을 결정합니다.

.controller('viewCtrl', function ($scope) { 
    $scope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { 

     // create an array of state names, in the order they will appear 
     var states = ['state1', 'state2', 'state3']; 

     if (states.indexOf(toState.name) < states.indexOf(fromState.name)) { 
      $scope.back = true; 
     } 
     else { 
     $scope.back = false; 
     } 
    }); 
}); 

코덱 (Codepen)은 작업 결과를 보여줍니다. http://codepen.io/anon/pen/zBQERW

관련 문제