2013-07-17 2 views
26

Я пытаюсь перейти к элементу на странице после того, как я его покажу. И.Е. У меня очень длинный список пользователей, и я показываю их как список. У каждого элемента есть значок редактирования, который вы можете щелкнуть. При щелчке я показываю форму пользователя, которая находится в верхней части страницы. Затем я хочу прокрутить список до этого места.Прокрутить вниз до 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 и видимо в первый раз, когда я нажимаю edit. Это тоже не решило мою проблему. Так ли это в DOM или нет, скрытый или не первый прокрутка к неудаче.

Любая идея, что я делаю неправильно?

Edit:

Я думаю, я знаю, что происходит, но я понятия не имею, как ее решить. Я использую маршрутизацию в своем приложении. У меня есть маршруты, такие как:

/#/главный /#/админ

Его моя страница администратора, который я использую свиток, который вызывает проблемы. Вот HTML я хочу, чтобы перейти к:

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

Проблема заключается в том, когда я использую угловой для прокрутки она изменяет свой URL, чтобы:

/#/админ # админ-формы

Когда делает это, кажется, попадает в контроллер маршрута и перезагружает мою страницу администратора, поэтому свиток не происходит. как только я нахожусь в URL-адресе/#/admin # admin-form, прокрутка работает, потому что угловой не видит изменения в моем маршруте и не перезагружает страницу. Но если я верну свой url обратно в/#/admin и нажмите кнопку, которая выполняет прокрутку до углового, снова изменит URL-адрес на/#/admin # admin-form.

Я уверен, что это так, как ожидалось, но я понятия не имею, как это исправить. Или, если смогу.

+0

Это поможет увидеть больше кода.Я полагаю, вы делаете это в рамках директивы? –

ответ

60

маршрутизация кажется углами главным подобрать изменения, которые в моем случае это плохо, потому что scrollTo перенаправляет меня, чтобы вернуться к главной странице администратора.

Прокрутка, а затем сброс $ location.hash() настолько угловатая, что не кажется, что изменение в URL-адресе кажется сработавшим.

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


Edit:

Как уже упоминалось в комментарии от @ theunexpected1, так как 1.4.0, Угловое-х $anchorScroll позволяет напрямую передавать идентификатор в качестве параметра без необходимости обновления URL с хеш:

$scope.scrollTo = function(id) { 

    // Pass the 'id' as the parameter here, the page will scroll 
    // to the correct place and the URL will remain intact. 
    $anchorScroll(id); 
} 
+2

СПАСИБО, ЭТО работало для меня! Похоже, это глупое дело. И я хочу, чтобы это решение было рядом с документацией на 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. Фактическая прокрутка выполняется с помощью $ watch, который устанавливается $ anchorScroll, который обрабатывается во время $ digest.
  3. Независимо от того, что вы настраиваете, чтобы показать/скрыть этот элемент формы, также обрабатывается в $ watch в $ digest.

Так что мне кажется, что он пытается обработать прокрутку, прежде чем обрабатывать значение, чтобы показать форму.Чтобы исправить это, я бы попытался либо реорганизовать код, который вы используете, чтобы показать форму, либо обернуть вызов $ anchorScroll в $ timeout, чтобы убедиться, что он был исключен после просмотра шоу.

Я надеюсь, что это поможет.

+0

Спасибо, я посмотрю, смогу ли я получить скрипку, которая воспроизводит проблему. Что касается тайм-аута, то это просто лучшее предположение, как долго я думаю, что это займет? Было бы неплохо, если бы был обратный вызов для вызова «show», который выполнялся, когда show/digest был сделан, но не думаю, что есть. – lostintranslation

+0

Нет, это будет просто «немедленный» тайм-аут: '$ timeout (function() {$ anchorScroll();});' идея состоит в том, чтобы заставить углы обрабатывать $ digest и отображать форму перед тем, как прокрутить , –

+0

Еще одна вещь: возникают ли ошибки в консоли? Может быть, это что-то действительно простое, например, вы забыли ввести $ anchorScroll или что-то еще? (Просто мысль, так как я не вижу ваш код) –

1

Я создал плунжер, чтобы продемонстрировать эту проблему. Обратите внимание, как вам нужно дважды щелкнуть кнопку, чтобы сообщение появилось?

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

3

Для справок в будущем - и любой, кто пришел сюда с той же проблемой прокрутки, но является n ot используя ng-маршруты для прокрутки, ответ @ Ben_Lesh на самом деле довольно проницателен.

Я использовал

$location.hash(id) 
$anchorScroll() 

для прокрутки, но и работает в той же проблемы в отношении первого времени нажмите не работает. Я понял, что проблема в том, что мой первый щелкнул объект был видимым, а затем попытался прокрутить к нему, но во время прокрутки элемент оставался не отображается на странице. Затем в конце цикла страница повторно отображается.

Во второй раз, когда я нажимаю, теперь элемент устанавливает на видимые, поэтому прокрутка отлично работает.

Раствор, после того, как вы установите логическое значение, что делает ваш элемент видимым, вызвать

$ таймаут (функция() {$ объем. $ Применяется()}, 0)

затем вызовите функцию прокрутки. Таким образом вы принудительно перенаправляете перед прокруткой. Вуаля!

+0

Это не совсем всегда работает, к сожалению, поскольку вы можете получить сообщение об ошибке, которое уже происходит. Другим решением является использование $ timeout для отсрочки выполнения прокрутки до завершения текущего дайджеста –

8

Я обнаружил, что если бы мне захотелось прокрутиться к определенному элементу, меня не интересовало обновление URL-адреса, чтобы показать, какой идентификатор я собирался (например, # admin-form id в www.something.com/#admin -form)

Итак, чтобы прокрутить без обновления URL-адреса, я обнаружил, что вы можете просто вызвать anchorscroll, не требуя обновления хэша местоположения.

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

Вы просто вызываете метод и добавляете в имя/идентификатор класса элемента, который вы хотите прокрутить сюда? Конечно, это не может быть так просто. – Brendan

+0

Чтобы использовать слова пары знаменитых мееркатов «просто», – chris31389