ページのリロード時に特定のアンカー タグまでスクロールする必要があります。$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 コンテキストで評価されないのはなぜですか? ご協力ありがとうございました!