2015-05-14 6 views
16

Мне нужно установить событие нг щелчка, так что, что он загружает новую страницу, а затем, после загрузки страницы, прокручивается на точку привязки на этой странице. Я пробовал все предлагаемые решения на this SO post, но я не могу заставить его работать правильно.Выделите якорь после загрузки страницы в угловом

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

Вот мой взгляд код:

<div class="see-jobs-btn" ng-click="$event.stopPropagation();goToResultJobs(r)">See Jobs</div> 

Это представляет собой кнопку внутри «профиля карты». Когда пользователь нажимает на карту, она переводит их на страницу профиля. Однако, когда они нажимают кнопку, нужно передать их в #jobs часть этой страницы профиля (отсюда $ stopPropogation() перед goToResultJobs (r) в коде).

Вот как выглядит мой метод goToResultJobs.

$scope.goToResultJobs = function(result) { 
    var profileUrl = result.slug; 
    window.location = profileUrl; 
}; 

Я попытался с помощью $anchorScroll и просто жестко прописывать в якорь в profileUrl, но ни один работает. Я довольно новичок в Angular, поэтому не знаю, чего мне здесь не хватает.

UPDATE 1: Попытка использовать $ тайм-аут

Вот мой goToResultJobs метод в моем ResultsCtrl, который срабатывает, когда пользователь нажимает на кнопку:

$scope.goToResultJobs = function(result) { 
    var url = window.location + result.slug + '#jobs'; 
    location.replace(url); 
}; 

Это загружает /name#jobs путь, который называет ProfileCtrl ниже:

app.controller('ProfileCtrl', ['$scope', '$http', '$timeout', '$location', '$anchorScroll', 
function($scope, $http, $timeout, $location, $anchorScroll) { 
    if(window.location.hash) { 
     $timeout(function() { 
      console.log('TEST'); 
      // $location.hash('jobs'); 
      // $location.hash('jobs'); 
      $anchorScroll(); 
     }, 1000); 
    }; 
}]); 

Эта настройка, похоже, работает, поскольку TEST появляется только в консоли при нажатии кнопки задания, но не тогда, когда пользователь просто нажимает на профиль. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что страница начинает загружаться, а путь в строке url изменяется на /name#jobs, но до того, как страница заканчивает загрузку, jobs удаляется с URL-адреса. Поэтому, когда вызывается $anchorScroll(), в хеше нет метки привязки для прокрутки.

+1

Вы пытались использовать '$ таймаут ($ anchorScroll())'? – Tony

+0

Попробуйте [anchorscroll] (https://docs.angularjs.org/api/ng/service/$anchorScroll) – PSL

+0

Я пробовал использовать $ timeout, но он, похоже, не срабатывает. Я вставил инструкцию console.log, но «TEST» никогда не появляется в консоли. См. Мой вопрос выше для обновленного кода: – ACIDSTEALTH

ответ

0

Возможно, после загрузки страницы вы можете использовать Element.scrollIntoView() собственного Javascript.

+2

Ключевым моментом здесь является то, что используемая техника прокрутки должна произойти после загрузки страницы. Даже небольшой «тайм-аут» должен работать. – Tony

+0

Лучше не отвечать на вопрос вопросом. – Luke

0

Try:

angular.module('anchorScrollExample', []) 
.controller('ScrollController', ['$scope', '$location', '$anchorScroll', 
    function ($scope, $location, $anchorScroll) { 
     $scope.gotoBottom = function() { 
     // set the location.hash to the id of 
     // the element you wish to scroll to. 
     $location.hash('bottom'); 

     $anchorScroll(); 
    }; 
}]); 

«снизу» здесь идентификатор вашего HTML элемента, к которому вы хотите, чтобы перейти к.

Документация здесь: https://docs.angularjs.org/api/ng/service/$anchorScroll

+0

Это было предложено в ссылке, которую я опубликовал с моим вопросом. Это не работает, потому что $ anchorScroll необходимо запускать ПОСЛЕ загрузки страницы. – ACIDSTEALTH

15

Итак, как указывалось, $anchorScroll должно произойти после того, как страница была оказана, в противном случае якорь не существует. Этого можно достичь с помощью $timeout().

$timeout(function() { 
    $anchorScroll('myAnchor'); 
}); 

Вы можете увидеть this plunkr. Обязательно просмотрите его в режиме всплытия (маленькая синяя кнопка в верхнем правом углу экрана вывода).

+0

Я переместил это прямо в мой контроллер (то же, что и в plunkr), но теперь он не срабатывает вообще. – ACIDSTEALTH

+0

Получаете ли вы какие-либо ошибки в консоли? Единственный способ, которым код в этом блоке не выполнялся, - это если вы не вводили '$ timeout'. – Tony

+0

Замечу, что у меня возникают проблемы с версией '$ location.hash'. Я вижу, что в вашем обновлении вы удалили тег из '$ anchorScroll', что было единственным способом заставить его работать в plunkr (предоставлено, это plunkr). – Tony

2

Holy Moly, это может быть достигнуто путем простого добавления autoscroll="true" в шаблон:

<div autoscroll="true" data-ng-include='"/templates/partials/layout/text-column.html"'></div>

Documentation

+0

невероятный, абсолютно невероятный. – brod

+0

Он работает только с 'ng-include', хотя –