2013-07-17 3 views
26

'보여주기'후 페이지의 요소로 스크롤하려고합니다. I.E. 나는 아주 긴 사용자 목록을 가지고 있으며 목록으로 표시합니다. 각 요소에는 클릭 할 수있는 편집 아이콘이 있습니다. 클릭하면 페이지 맨 위에있는 사용자 양식이 표시됩니다. 그런 다음 그 위치로 스크롤하고 싶습니다. 편집 사용자가 클릭에angularjs로 스크롤

// helper method to scroll 
    $scope.scrollTo = function (id) { 
    $location.hash(id); 
    $anchorScroll(); 
    } 

:

$scope.editUser = function (user) { 
    $scope.user = user; // set user 
    $scope.setShowUserForm(true); // show edit form 
    $scope.scrollTo('admin-form'); // scroll to the form 
    } 

이 처음을 제외하고 잘 작동합니다. 내가 DOM을 확인하고 내 'user-form'요소가 DOM에 있지만 숨겨진 것이므로 원하는 것입니다. 편집 사용자를 처음 클릭하면 스크롤이 작동하지 않습니다. 처음 실패하면 모든 것이 정상입니다. 나는 무엇이 바뀌 었는지 확신하지 못한다.

기본적으로 표시 할 양식을 설정하여 DOM에 있었고 편집을 처음 클릭했을 때 표시되도록했습니다. 그것도 내 문제를 해결하지 못했습니다. 그래서 그것의 DOM 여부에 상관없이 숨겨진 또는 첫 번째 스크롤 실패합니다.

내가 뭘 잘못하고 있는지 알기!

편집 :

는 내가 무슨 일이 일어나고 있는지 알고 있다고 생각하지만 난 그것을 해결하는 방법을 모른다. 내 응용 프로그램에서 라우팅을 사용하고 있습니다.

/#/주 /#/관리자가 문제를 일으키는에 내가 스크롤을 사용하고

그것의 내 관리자 페이지 : 내가 좋아하는 경로를 가지고있다. 경우

/#/관리 번호 관리 형태

: 나는 내 URL을 변경 스크롤 각도 사용할 때

<div id="admin-form"> 
... 
</div> 

문제있다 : 여기로 스크롤 할 HTML입니다 그것이 루트 컨트롤러를 치고 스크롤이 발생하지 않는 이유 인 내 관리자 페이지를 다시로드하는 것처럼 보입니다. 일단/#/admin # admin-form url을 입력하면 각도가 내 경로의 변경 사항을 보지 못하고 페이지를 다시로드하지 않기 때문에 스크롤이 작동합니다. 하지만 내 URL을/#/admin으로 변경하고 각도로 스크롤하는 버튼을 클릭하면 URL이/#/admin # admin-form으로 다시 변경됩니다.

이것이 예상대로 나올 것이라고 확신하지만 어떻게 수정해야하는지 잘 모릅니다. 아니면 할 수 있다면.

+0

더 많은 코드를 볼 수 있습니다.나는 당신이 지시어 내에서 이것을한다고 가정합니까? –

답변

60

Angulars 라우팅은 scrollTo 메인 관리자 페이지로 다시 저를 다시 라우팅 때문에 내 경우에는 나쁜 변화를 데리러 것으로 보인다.

$ location.hash()를 스크롤 한 다음 다시 설정하면 각도가 변경되어도 URL의 변경 사항이 작동하지 않는 것으로 판단됩니다.

$scope.scrollTo = function (id) { 
    var old = $location.hash(); 
    $location.hash(id); 
    $anchorScroll(); 
    $location.hash(old); 
    } 


편집 :

각도의 $anchorScroll가 직접와 URL을 업데이트 할 필요없이 매개 변수로 ID를 전달할 수 있습니다 1.4.0 때문에, @ theunexpected1에 의해 코멘트에서 언급 한 바와 같이

, 해시 :

+2

고맙습니다. IT는 저를 위해 일했습니다! 이것을 위해해야 ​​할 바보 같은 것 같습니다. 이 솔루션이 AngularJS.org의 설명서 옆에 있었으면 좋겠습니다. –

+0

대단히 감사합니다! 지금까지 – Sharov

+2

+1. 이것에 대한 해결책은 1.4.0 (Ref : https://github.com/angular/angular.js/issues/4568)에서 발표되었습니다. 즉, $ anchorScroll ('hash')는 위치 해시를 업데이트하지 않고 스크롤 할 것입니다. – theunexpected1

1

당신은 내 blog과 이에 대한 질문에이 질문을 올렸습니다. 코드의 모든 보지 않고

, 나는 단지이 추측 할 수 있지만, 나는 당신에게 도움이 될 몇 가지 알 수 있습니다 :

  1. 당신이 숨겨진 요소에 스크롤 할 수 있습니다.
  2. 실제 스크롤은 $ digest 중에 처리되는 $ anchorScroll에 의해 설정되는 $ watch에 의해 수행됩니다.
  3. 양식 요소를 표시하거나 숨기려면 설정하는 모든 항목도 $ digest의 $ watch에서 처리되고 있습니다.

그래서 나에게 모양을 보여주기 위해 값을 처리하기 전에 스크롤을 처리하려고합니다.이 문제를 해결하려면 양식을 표시하는 데 사용하는 코드를 리팩터링하거나 $ timeout에 $ anchorScroll 호출을 래핑하여 쇼 시계 후에 실행되도록하십시오.

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

+0

고마워, 내가 문제를 재현 한 피들을 게시 할 수 있는지 알게 될 것이다. 타임 아웃에 관해서는 여기에 가장 좋은 추측은 이것이 얼마나 오래 걸릴 것이라고 생각합니까? 쇼/다이제스트가 끝났을 때 실행 된 'show'콜백에 대한 콜백이 있었지만 거기에 있다고 생각하지 않는다면 좋을 것입니다. – lostintranslation

+0

아니요, 그냥 "즉각적인"시간 초과 일 것입니다 : $ timeout (function() {$ anchorScroll();}) '각도가 $ digest를 처리하고 스크롤을하기 전에 양식을 표시하도록하는 아이디어 . –

+0

한 가지 더 : 콘솔에 오류가 있습니까? 어쩌면 이것은 정말 간단합니다. $ anchorScroll 같은 것을 삽입하는 것을 잊어 버린 것 같습니까? (당신의 코드를 볼 수 없기 때문에 그냥 생각) –

3

나중에 참조 할 수있는 동일한 문제가있는 스크롤링에 대해서는 n이지만 스크롤 할 때 ng-routes를 사용하면 @ Ben_Lesh의 대답은 사실 꽤 통찰력이 있습니다.

나는 스크롤

$location.hash(id) 
$anchorScroll() 

를 사용하여뿐만 아니라 처음 클릭 작동하지에 대한 동일한 문제로 실행되었다. 문제가 내 첫 번째 클릭 클릭 개체를 볼 수 설정 한 다음 그것을 스크롤하려고했지만 스크롤했을 때 요소가 여전히 페이지에 표시되지 않았습니다. 그런 다음주기가 끝나면 페이지가 다시 렌더링됩니다.

두 번째로 클릭하면 요소가 으로 설정되어이 표시되도록 설정되어 있으므로 스크롤이 정상적으로 작동합니다. 당신이 당신의 요소를 볼 수 부울을 설정 한 후

이 솔루션은 는

$ 시간 제한 호출하는 것입니다 ({(). $ $ 범위에 적용}() 함수를 0)

다음 스크롤 기능을 호출하십시오. 이렇게하면 스크롤하기 전에 다시 렌더링해야합니다. 빌라!

+0

digest가 이미 진행 중입니다. 또 다른 해결책은 $ timeout을 사용하여 실행중인 다이제스트가 완료 될 때까지 스크롤의 실행을 연기하는 것입니다. –

8

특정 요소로 스크롤하고 싶다면 URL을 업데이트하는 데 관심이 없었습니다 (예 : www.something.com/#admin의 # admin-form id). -form)

URL을 업데이트하지 않고 스크롤하면 위치 해시를 업데이트 할 필요없이 앵커 스크롤을 호출 할 수 있다는 것을 알았습니다.

$anchorScroll('admin-form'); 
+1

방금 ​​메서드를 호출하고 스크롤 할 요소의 클래스 이름/ID를 여기에 추가합니까? 확실하게 그렇게 쉬울 수는 없습니다. – Brendan

+0

유명한 meerkats "simples"의 커플의 단어를 사용하려면 – chris31389