【发布时间】:2015-07-26 13:49:09
【问题描述】:
我需要设置一个 ng-click 事件,以便它加载一个新页面,然后在页面加载后滚动到页面上的锚点。我已经尝试了this SO post 上提出的所有解决方案,但我无法让它正常工作。
这些解决方案中的大多数都围绕滚动到已加载页面上的锚点。我需要在新页面加载后进行滚动。
这是我的查看代码:
<div class="see-jobs-btn" ng-click="$event.stopPropagation();goToResultJobs(r)">See Jobs</div>
这表示“个人资料卡”中的一个按钮。当用户点击卡片时,它会将他们带到个人资料页面。但是,当他们单击该按钮时,它需要将他们带到该个人资料页面的#jobs 部分(因此在代码中的 goToResultJobs(r) 之前有 $stopPropogation())。
这是我的 goToResultJobs 方法的样子。
$scope.goToResultJobs = function(result) {
var profileUrl = result.slug;
window.location = profileUrl;
};
我尝试过使用$anchorScroll 并将锚点硬编码到profileUrl 中,但两者都不起作用。我对 Angular 很陌生,所以我不知道我在这里缺少什么。
更新 1:尝试使用 $timeout
这是我的 ResultsCtrl 中的 goToResultJobs 方法,当用户单击按钮时触发:
$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()被调用时,hash中没有可以滚动到的锚标签。
【问题讨论】:
-
您是否尝试过使用
$timeout($anchorScroll())? -
我尝试使用 $timeout 但它似乎没有触发。我插入了一个console.log 语句,但'TEST' 从未出现在控制台中。请参阅上面我的问题以获取更新的代码:
-
是的,因为您离开页面然后尝试进行超时,但随着页面的更改,超时就消失了。尝试让
$timeout挂出,以便在加载时执行。哈希应该已经在 URL 中。 -
那么 $timeout 应该在我的 Angular 代码中的什么位置?正在加载的页面没有控制器,只有列出所有配置文件卡的页面。