我需要在页面重新加载时滚动到特定的锚标记。我尝试使用 $anchorScroll 但它评估 $location.hash(),这不是我需要的。
我根据 $anchorScrollProvider 的源代码编写了一个自定义提供程序。在其中,它向 rootScope 的 $watch 列表添加一个值,并在更改时调用 $evalAsync。
提供者:
zlc.provider('scroll', function() {
this.$get = ['$window', '$rootScope', function($window, $rootScope) {
var document = $window.document;
var elm;
function scroll() {
elm = document.getElementById($rootScope.trendHistory.id);
if (elm) elm.scrollIntoView();
}
$rootScope.$watch(function scrollWatch() {return $rootScope.trendHistory.id;},
function scrollWatchAction() {
if ($rootScope.trendHistory.id) $rootScope.$eval(scroll);
});
return scroll;
}];
});
现在,当我尝试在控制器中调用滚动提供程序时,我必须在调用 scroll() 之前使用 $scope.$apply() 强制执行摘要:
控制器:
//inside function called on reload
$scope.apply();
scroll();
为什么我必须调用 $scope.$apply()?为什么在当前范围内调用时,滚动函数不在 Angular 上下文中进行评估?谢谢您的帮助!