Cách xử lý liên kết băm neo trong AngularJS


318

Có ai trong số các bạn biết cách xử lý liên kết băm neo trong AngularJS không?

Tôi có đánh dấu sau cho một trang Câu hỏi thường gặp đơn giản

<a href="#faq-1">Question 1</a>
<a href="#faq-2">Question 2</a>
<a href="#faq-3">Question 3</a>

<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="fa1-3">Question 3</h3>

Khi nhấp vào bất kỳ liên kết nào ở trên, AngularJS chặn và chuyển tôi đến một trang hoàn toàn khác (trong trường hợp của tôi, trang 404 vì không có tuyến nào khớp với các liên kết.)

Suy nghĩ đầu tiên của tôi là tạo ra một tuyến phù hợp " / faq /: chương " và trong bộ điều khiển tương ứng kiểm tra $routeParams.chaptersau một phần tử phù hợp và sau đó sử dụng jQuery để cuộn xuống nó.

Nhưng sau đó AngularJS lại tiếp tục tấn công tôi và chỉ cần cuộn lên đầu trang.

Vì vậy, có ai ở đây đã làm bất cứ điều gì tương tự trong quá khứ và biết một giải pháp tốt cho nó?

Chỉnh sửa: Chuyển sang html5Mode sẽ giải quyết vấn đề của tôi nhưng dù sao chúng tôi cũng phải hỗ trợ IE8 + vì vậy tôi sợ đó không phải là giải pháp được chấp nhận: /


Tôi nghĩ rằng góc cạnh gợi ý để sử dụng ng-href=""thay thế.
cõng

10
Tôi nghĩ ng-href chỉ có thể áp dụng nếu url chứa dữ liệu động cần được ràng buộc với mô hình ng. Tôi tự hỏi nếu bạn chỉ định hashPrefix cho locationProvider nếu nó sẽ bỏ qua liên kết đến ID's: docs.angularjs.org/guide/dev_guide.service.$location
Adam

Adam đúng về cách sử dụng ng-href.
Rasmus


Đây cũng là một vấn đề đối với Angular mới: stackoverflow.com/questions/36101756/
triệt

Câu trả lời:


375

Bạn đang tìm kiếm $anchorScroll().

Đây là tài liệu (crappy).

Và đây là nguồn.

Về cơ bản, bạn chỉ cần tiêm nó và gọi nó trong bộ điều khiển của bạn, và nó sẽ cuộn bạn đến bất kỳ phần tử nào có id được tìm thấy trong $location.hash()

app.controller('TestCtrl', function($scope, $location, $anchorScroll) {
   $scope.scrollTo = function(id) {
      $location.hash(id);
      $anchorScroll();
   }
});

<a ng-click="scrollTo('foo')">Foo</a>

<div id="foo">Here you are</div>

Đây là một plunker để chứng minh

EDIT: để sử dụng điều này với định tuyến

Thiết lập định tuyến góc của bạn như bình thường, sau đó chỉ cần thêm mã sau đây.

app.run(function($rootScope, $location, $anchorScroll, $routeParams) {
  //when the route is changed scroll to the proper element.
  $rootScope.$on('$routeChangeSuccess', function(newRoute, oldRoute) {
    $location.hash($routeParams.scrollTo);
    $anchorScroll();  
  });
});

và liên kết của bạn sẽ trông như thế này:

<a href="#/test?scrollTo=foo">Test/Foo</a>

Dưới đây là một Plunker thể hiện việc cuộn với định tuyến và $ anchorScroll

Và thậm chí đơn giản hơn:

app.run(function($rootScope, $location, $anchorScroll) {
  //when the route is changed scroll to the proper element.
  $rootScope.$on('$routeChangeSuccess', function(newRoute, oldRoute) {
    if($location.hash()) $anchorScroll();  
  });
});

và liên kết của bạn sẽ trông như thế này:

<a href="#/test#foo">Test/Foo</a>

5
Vấn đề có thể xảy ra khi bạn thêm định tuyến: nếu thêm ngView, mỗi lần thay đổi băm của url sẽ kích hoạt tải lại tuyến đường ... Trong ví dụ của bạn không có định tuyến và url không phản ánh mục hiện tại ... Nhưng cảm ơn bạn đã chỉ đến $ anchorScroll
Valentyn Shybanov

1
@bledh, gọi location.hash (X) thay đổi trang vì định tuyến kiểm soát các chế độ xem.
DSldsl

24
Giải pháp này khiến toàn bộ ứng dụng của tôi hiển thị lại.

2
@dsldsl && @OliverJosephAsh: $ location.hash () sẽ không tải lại trang. Nếu có, có một cái gì đó khác đang diễn ra. Đây là cùng một thời gian với thời gian được viết ra khi trang đang tải, bạn sẽ thấy nó không thay đổi Nếu bạn muốn cuộn đến một thẻ neo trên trang hiện tại mà không cần tải lại tuyến đường, bạn chỉ cần làm một liên kết thường xuyên <a href="#foo">foo</a>. Mẫu mã của tôi là hiển thị cuộn đến một id trên thường trình.
Ben Lesh

4
@bledh: Tôi khuyên bạn cũng nên xóa băm sau khi cuộn đến phần mong muốn, bằng cách này, URL không bị ô nhiễm với những thứ thực sự không nên có. Sử dụng cái này: $location.search('scrollTo', null)
kumarharsh

168

Trong trường hợp của tôi, tôi nhận thấy rằng logic định tuyến đã khởi động nếu tôi sửa đổi $location.hash(). Thủ thuật sau đây đã có hiệu quả ..

$scope.scrollTo = function(id) {
    var old = $location.hash();
    $location.hash(id);
    $anchorScroll();
    //reset to old to keep any additional routing logic from kicking in
    $location.hash(old);
};

5
Rất cảm ơn vì điều đó, logic định tuyến hoàn toàn từ chối hành xử ngay cả khi sử dụng giải pháp .sl (...) của @ b Meat, và điều này sắp xếp nó.
ljs

8
Thủ thuật "lưu băm cũ" của bạn đã là một cứu cánh tuyệt đối. Nó ngăn chặn tải lại trang trong khi giữ cho tuyến sạch sẽ. Ý tưởng tuyệt vời
ThisLanham

2
Đẹp một. Nhưng sau khi thực hiện giải pháp của bạn, url không cập nhật giá trị của id mục tiêu.
Mohamed Hussain

1
Tôi đã có trải nghiệm tương tự như Mohamed ... Nó thực sự đã dừng tải lại nhưng nó hiển thị tuyến băm (và $ anchorScroll không có hiệu lực). 1.2.6 Hmmmm.
michael

3
Tôi sử dụng $location.hash(my_id); $anchorScroll; $location.hash(null). Nó ngăn tải lại và tôi không phải quản lý oldbiến.
MFB

53

Không cần thay đổi bất kỳ định tuyến hoặc bất cứ điều gì khác chỉ cần sử dụng target="_self"khi tạo các liên kết

Thí dụ:

<a href="#faq-1" target="_self">Question 1</a>
<a href="#faq-2" target="_self">Question 2</a>
<a href="#faq-3" target="_self">Question 3</a>

Và sử dụng idthuộc tính trong các phần tử html của bạn như thế này:

<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="faq-3">Question 3</h3>

Không cần sử dụng ## như được chỉ / đề cập trong các bình luận ;-)


1
Điều này không hiệu quả với tôi, nhưng giải pháp ở đây đã làm: stackoverflow.com/a/19367249/633107
Splaktar

6
Cảm ơn giải pháp này. Nhưng mục tiêu = "_ tự" là đủ. Không cần phải tăng gấp đôi #
Barshe P

5
target = "_ self" chắc chắn là câu trả lời tốt nhất (không cần phải tăng gấp đôi #, như được chỉ ra bởi Barshe P). Điều này hoạt động không có vấn đề nếu bật hoặc tắt Html5Mode.
newman

3
Đơn giản và đầy đủ. Làm việc cho tôi mà không cần thêm một phụ thuộc góc khác.
adeady

4
Đây là giải pháp đúng đắn. Không cần liên quan đến dịch vụ $ anchorScroll góc cạnh. Xem tài liệu cho một thẻ: https://developer.mozilla.org/en/docs/Web/HTML/Euity/a
Yiling

41
<a href="##faq-1">Question 1</a>
<a href="##faq-2">Question 2</a>
<a href="##faq-3">Question 3</a>

<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="faq-3">Question 3</h3>

Tuyệt vời! Cho đến nay, giải pháp đơn giản nhất, nhưng có ý tưởng nào để liên kết đến một mỏ neo trên một trang riêng biệt không? (tức là / sản phẩm # sách)
8bithero

Tôi nghĩ rằng nó giống như giải pháp (/ sản phẩm ## sách) trong AngularJS
lincolnge

1
Theo kinh nghiệm của tôi, href = "##" chỉ hoạt động khi $ anchorScroll được chèn.
Công viên Brian

9
điều này có vẻ tương đối đơn giản nhưng nó không hoạt động :-(
brykneval

4
Tôi đã thêm target = "_ self" và nó hoạt động như bùa mê cho tất cả các loại điều hướng trong trang (đọc thanh trượt, đi đến các phần khác nhau, v.v.). Cảm ơn bạn đã chia sẻ thủ thuật tuyệt vời và đơn giản nhất này.
Kumar Nitesh

19

Nếu bạn luôn biết tuyến đường, bạn chỉ cần nối thêm neo như thế này:

href="#/route#anchorID

nơi routelà con đường góc hiện tại và anchorIDphù hợp với một <a id="anchorID">nơi nào đó trên trang


1
Điều này kích hoạt thay đổi tuyến đường AngularJS bình thường và do đó không được khuyến khích. Trong trường hợp của tôi, nó rất trực quan vì các video YouTube trong trang FAQ / Trợ giúp được tải lại.
Robin Andersson

9
@ RobinWassén-Andersson bằng cách chỉ định reloadOnSearch: falsetuyến đường đó trong cấu hình tuyến đường của bạn, angular sẽ không kích hoạt thay đổi tuyến đường và sẽ chỉ cuộn đến id. Kết hợp với tuyến đường đầy đủ được chỉ định trong athẻ, tôi sẽ nói đây là giải pháp đơn giản và đơn giản nhất.
Elise

Cảm ơn bạn. Điều này đã giúp tôi. Tôi không sử dụng bất kỳ tuyến tùy chỉnh nào trong ứng dụng của mình, vì vậy, a href = "# / # tên neo" hoạt động rất tốt!
Jordan

14

$anchorScroll hoạt động cho việc này, nhưng có một cách tốt hơn để sử dụng nó trong các phiên bản gần đây hơn của Angular.

Bây giờ, $anchorScrollchấp nhận hàm băm như một đối số tùy chọn, vì vậy bạn không phải thay đổi $location.hashgì cả. ( tài liệu )

Đây là giải pháp tốt nhất vì nó hoàn toàn không ảnh hưởng đến tuyến đường. Tôi không thể có bất kỳ giải pháp nào khác hoạt động vì tôi đang sử dụng ngRoute và tuyến đường sẽ tải lại ngay khi tôi đặt $location.hash(id), trước khi $anchorScrollcó thể thực hiện phép thuật của mình.

Đây là cách sử dụng nó ... đầu tiên, trong chỉ thị hoặc bộ điều khiển:

$scope.scrollTo = function (id) {
  $anchorScroll(id);  
}

và sau đó trong chế độ xem:

<a href="" ng-click="scrollTo(id)">Text</a>

Ngoài ra, nếu bạn cần tính đến một thanh điều hướng cố định (hoặc giao diện người dùng khác), bạn có thể đặt giá trị bù cho $ anchorScroll như thế này (trong chức năng chạy của mô-đun chính):

.run(function ($anchorScroll) {
   //this will make anchorScroll scroll to the div minus 50px
   $anchorScroll.yOffset = 50;
});

Cảm ơn. Làm thế nào bạn sẽ thực hiện chiến lược của mình cho một liên kết băm kết hợp với thay đổi tuyến đường? Ví dụ: nhấp vào mục điều hướng này, mở ra một chế độ xem khác và cuộn xuống một mục cụ thể idtrong chế độ xem đó.
Kyle Vassella

Sry to pester..Nếu bạn có cơ hội, bạn có thể lướt qua câu hỏi Stack của tôi không? Tôi cảm thấy câu trả lời của bạn ở đây đã khiến tôi rất gần nhưng tôi không thể thực hiện nó: stackoverflow.com/questions/41494330/ . Tôi cũng đang sử dụng ngRoutevà phiên bản mới hơn của Angular.
Kyle Vassella

Tôi xin lỗi tôi đã không thử trường hợp cụ thể đó ... nhưng bạn đã xem $ location.search () hoặc $ routeParams chưa? Có lẽ bạn có thể sử dụng cái này hoặc cái kia khi khởi tạo bộ điều khiển của mình - nếu cuộn Tìm kiếm của bạn nằm trong URL, thì bộ điều khiển có thể sử dụng $ anchorScroll như trên để cuộn trang.
Rebecca

2
Bằng cách chuyển Id trực tiếp đến $ anchorScroll, các tuyến của tôi đã thay đổi từ một cái gì đó như / contact # contact thành just / contact. Đây phải là câu trả lời được chấp nhận imho.
RandomUs1r

12

Đây là giải pháp của tôi bằng cách sử dụng một lệnh có vẻ Angular-y hơn vì chúng tôi đang xử lý DOM:

Plnkr ở đây

github

angular.module('app', [])
.directive('scrollTo', function ($location, $anchorScroll) {
  return function(scope, element, attrs) {

    element.bind('click', function(event) {
        event.stopPropagation();
        var off = scope.$on('$locationChangeStart', function(ev) {
            off();
            ev.preventDefault();
        });
        var location = attrs.scrollTo;
        $location.hash(location);
        $anchorScroll();
    });

  };
});

HTML

<ul>
  <li><a href="" scroll-to="section1">Section 1</a></li>
  <li><a href="" scroll-to="section2">Section 2</a></li>
</ul>

<h1 id="section1">Hi, I'm section 1</h1>
<p>
Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De carne lumbering animata corpora quaeritis. 
 Summus brains sit​​, morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris. 
Hi mindless mortuis soulless creaturas, imo evil stalking monstra adventus resi dentevil vultus comedat cerebella viventium. 
Nescio brains an Undead zombies. Sicut malus putrid voodoo horror. Nigh tofth eliv ingdead.
</p>

<h1 id="section2">I'm totally section 2</h1>
<p>
Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De carne lumbering animata corpora quaeritis. 
 Summus brains sit​​, morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris. 
Hi mindless mortuis soulless creaturas, imo evil stalking monstra adventus resi dentevil vultus comedat cerebella viventium. 
Nescio brains an Undead zombies. Sicut malus putrid voodoo horror. Nigh tofth eliv ingdead.
</p>

Tôi đã sử dụng dịch vụ $ anchorScroll. Để chống lại việc làm mới trang đi cùng với thay đổi băm, tôi đã tiếp tục và hủy sự kiện locationChangeStart. Điều này làm việc cho tôi vì tôi có một trang trợ giúp được nối với một ng-switch và việc làm mới sẽ thực sự phá vỡ ứng dụng.


Tôi thích giải pháp chỉ thị của bạn. Tuy nhiên, làm thế nào bạn sẽ làm điều đó bạn muốn tải một trang khác và cuộn đến vị trí neo cùng một lúc. Nếu không có angularjs, nó sẽ là href = "location # hash". Nhưng chỉ thị của bạn ngăn chặn tải lại trang.
CMCDragonkai

@CMCDragonkai với chỉ thị của tôi, tôi không chắc lắm vì tôi sử dụng lệnh gọi tới $ anchorScroll, có vẻ như chỉ xử lý việc cuộn đến một phần tử hiện có trên trang. Bạn có thể phải lộn xộn với $ location hoặc $ window để lấy thứ gì đó liên quan đến việc thay đổi trang.
KhalilRavanna

2
Bạn cần hủy đăng ký khỏi sự kiện locationChangeStart: var off = scope. $ On ('$ locationChangeStart', function (ev) {off (); ev.preventDefault ();});

Bắt tốt @EugeneTskhovrebov, tôi đã tiếp tục và thêm nó vào câu trả lời trong một chỉnh sửa.
KhalilRavanna

5

Cố gắng đặt tiền tố băm cho các tuyến đường góc $locationProvider.hashPrefix('!')

Ví dụ đầy đủ:

angular.module('app', [])
  .config(['$routeProvider', '$locationProvider', 
    function($routeProvider, $locationProvider){
      $routeProvider.when( ... );
      $locationProvider.hashPrefix('!');
    }
  ])

Điều này không ảnh hưởng đến kết quả. Nó sẽ ngọt ngào mặc dù.
Rasmus

2
Bạn có chắc không. Tại sao điều này không làm việc? Nếu tiền tố băm là !, Thì định tuyến băm phải là trang #! Do đó, AngularJS nên phát hiện khi nó chỉ là #hash, nó sẽ neo tự động cuộn và hoạt động cho cả url chế độ HTML5 và url chế độ băm.
CMCDragonkai

5

Tôi đã khắc phục điều này trong logic lộ trình cho ứng dụng của mình.

function config($routeProvider) {
  $routeProvider
    .when('/', {
      templateUrl: '/partials/search.html',
      controller: 'ctrlMain'
    })
    .otherwise({
      // Angular interferes with anchor links, so this function preserves the
      // requested hash while still invoking the default route.
      redirectTo: function() {
        // Strips the leading '#/' from the current hash value.
        var hash = '#' + window.location.hash.replace(/^#\//g, '');
        window.location.hash = hash;
        return '/' + hash;
      }
    });
}

1
Điều này không hoạt động: Lỗi: [$ kim phun: modulerr] Không thể khởi tạo góc mô-đun do: Lỗi: 'trình xử lý' không hợp lệ khi ()
Geoidesic

5

Đây là một bài viết cũ, nhưng tôi đã dành một thời gian dài để nghiên cứu các giải pháp khác nhau vì vậy tôi muốn chia sẻ một giải pháp đơn giản hơn. Chỉ cần thêm target="_self"vào <a>thẻ đã cố định nó cho tôi. Liên kết hoạt động và đưa tôi đến vị trí thích hợp trên trang.

Tuy nhiên, Angular vẫn gây ra một số điều kỳ lạ với # trong URL để bạn có thể gặp rắc rối khi sử dụng nút quay lại để điều hướng và như vậy sau khi sử dụng phương pháp này.


4

Đây có thể là một thuộc tính mới cho ngView, nhưng tôi đã có thể làm cho nó liên kết băm neo hoạt động với việc angular-routesử dụng ngView autoscrollthuộc tính và 'băm kép'.

ngView (xem autoscroll)

(Đoạn mã sau được sử dụng với dây đeo góc)

<!-- use the autoscroll attribute to scroll to hash on $viewContentLoaded -->    
<div ng-view="" autoscroll></div>

<!-- A.href link for bs-scrollspy from angular-strap -->
<!-- A.ngHref for autoscroll on current route without a location change -->
<ul class="nav bs-sidenav">
  <li data-target="#main-html5"><a href="#main-html5" ng-href="##main-html5">HTML5</a></li>
  <li data-target="#main-angular"><a href="#main-angular" ng-href="##main-angular" >Angular</a></li>
  <li data-target="#main-karma"><a href="#main-karma" ng-href="##main-karma">Karma</a></li>
</ul>

3

Tôi có thể làm điều này như vậy:

<li>
<a href="#/#about">About</a>
</li>

2

Đây là cách giải quyết bẩn bằng cách tạo chỉ thị tùy chỉnh sẽ cuộn đến phần tử được chỉ định (với "faq" được mã hóa cứng)

app.directive('h3', function($routeParams) {
  return {
    restrict: 'E',
    link: function(scope, element, attrs){        
        if ('faq'+$routeParams.v == attrs.id) {
          setTimeout(function() {
             window.scrollTo(0, element[0].offsetTop);
          },1);        
        }
    }
  };
});

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


Điều này thực sự hoạt động, nhưng nó, như bạn nói, bẩn. Rất bẩn. Hãy xem liệu người khác có thể đưa ra giải pháp đẹp hơn không, hoặc tôi sẽ phải thực hiện điều này.
Rasmus

Angular đã có chức năng scrollTo được tích hợp thông qua $anchorScroll, xem câu trả lời của tôi.
Ben Lesh

Plunker đã thay đổi để ít bẩn hơn: nó sử dụng $ location.path () để không có "faq" được mã hóa cứng trong nguồn. Và cũng đã thử sử dụng $ anchorScroll, nhưng dường như do định tuyến nên nó không hoạt động ...
Valentyn Shybanov

2
<a href="/#/#faq-1">Question 1</a>
<a href="/#/#faq-2">Question 2</a>
<a href="/#/#faq-3">Question 3</a>

2

Nếu bạn không muốn sử dụng ng-clickđây là một giải pháp thay thế. Nó sử dụng một filterđể tạo url chính xác dựa trên trạng thái hiện tại. Ví dụ của tôi sử dụng ui.router .

Lợi ích là người dùng sẽ thấy nơi liên kết đi đến di chuột.

<a href="{{ 'my-element-id' | anchor }}">My element</a>

Bộ lọc:

.filter('anchor', ['$state', function($state) {
    return function(id) {
        return '/#' + $state.current.url + '#' + id;
    };
}])

2

Giải pháp của tôi với ng-route là chỉ thị đơn giản này:

   app.directive('scrollto',
       function ($anchorScroll,$location) {
            return {
                link: function (scope, element, attrs) {
                    element.click(function (e) {
                        e.preventDefault();
                        $location.hash(attrs["scrollto"]);
                        $anchorScroll();
                    });
                }
            };
    })

Html trông giống như:

<a href="" scrollTo="yourid">link</a>

Bạn sẽ không phải chỉ định thuộc tính như scroll-to="yourid"và đặt tên cho lệnh scrollTo(và truy cập thuộc tính là attrs["scrollTo"]? Bên cạnh đó, không bao gồm jQuery bao gồm trình xử lý phải được ràng buộc với element.on('click', function (e) {..}).
Theodros Zelleke

1

Bạn có thể thử sử dụng anchorScroll .

Thí dụ

Vì vậy, bộ điều khiển sẽ là:

app.controller('MainCtrl', function($scope, $location, $anchorScroll, $routeParams) {
  $scope.scrollTo = function(id) {
     $location.hash(id);
     $anchorScroll();
  }
});

Và quan điểm:

<a href="" ng-click="scrollTo('foo')">Scroll to #foo</a>

... và không có bí mật nào cho id neo:

<div id="foo">
  This is #foo
</div>

1

Tôi đã cố gắng làm cho ứng dụng Angular của mình cuộn xuống một neo opon đang tải và chạy vào các quy tắc viết lại URL của $ routeProvider.

Sau thời gian dài thử nghiệm tôi đã giải quyết điều này:

  1. đăng ký một trình xử lý sự kiện document.onload từ phần .run () của mô-đun ứng dụng Angular.
  2. trong trình xử lý tìm ra cái gốc có thẻ neo được cho là bằng cách thực hiện một số thao tác chuỗi.
  3. ghi đè lên vị trí $ neoScroll ().

angular.module("bla",[]).}])
.run(function($location, $anchorScroll){
         $(document).ready(function() {
	 if(location.hash && location.hash.length>=1)    		{
			var path = location.hash;
			var potentialAnchor = path.substring(path.lastIndexOf("/")+1);
			if ($("#" + potentialAnchor).length > 0) {   // make sure this hashtag exists in the doc.                          
			    location.hash = potentialAnchor;
			    $anchorScroll();
			}
		}	 
 });


1

Tôi không chắc chắn 100% nếu điều này hoạt động mọi lúc, nhưng trong ứng dụng của tôi, điều này mang lại cho tôi hành vi mong đợi.

Hãy nói rằng bạn đang ở trang GIỚI THIỆU và bạn có lộ trình sau:

yourApp.config(['$routeProvider', 
    function($routeProvider) {
        $routeProvider.
            when('/about', {
                templateUrl: 'about.html',
                controller: 'AboutCtrl'
            }).
            otherwise({
                redirectTo: '/'
            });
        }
]);

Bây giờ, trong HTML của bạn

<ul>
    <li><a href="#/about#tab1">First Part</a></li>
    <li><a href="#/about#tab2">Second Part</a></li>
    <li><a href="#/about#tab3">Third Part</a></li>                      
</ul>

<div id="tab1">1</div>
<div id="tab2">2</div>
<div id="tab3">3</div>

Tóm lại là

Bao gồm tên trang trước khi neo đã lừa tôi. Hãy cho tôi biết suy nghĩ của bạn.

Nhược điểm

Điều này sẽ kết xuất lại trang và sau đó cuộn đến neo.

CẬP NHẬT

Một cách tốt hơn là thêm vào như sau:

<a href="#tab1" onclick="return false;">First Part</a>

1

Nhận tính năng cuộn của bạn một cách dễ dàng. Nó cũng hỗ trợ cuộn Animated / Smooth như một tính năng bổ sung. Chi tiết cho thư viện Angular Scroll :

Github - https://github.com/oblador/angular-scroll

Cung cấp :bower install --save angular-scroll

NPM :npm install --save angular-scroll

Phiên bản Minfied - chỉ 9kb

Di chuyển mượt mà (cuộn hoạt hình) - có

Cuộn gián điệp - có

Tài liệu - xuất sắc

Bản trình diễn - http://oblador.github.io/angular-scroll/

Hi vọng điêu nay co ich.


1

Dựa trên @Stoyan tôi đã đưa ra giải pháp sau:

app.run(function($location, $anchorScroll){
    var uri = window.location.href;

    if(uri.length >= 4){

        var parts = uri.split('#!#');
        if(parts.length > 1){
            var anchor = parts[parts.length -1];
            $location.hash(anchor);
            $anchorScroll();
        }
    }
});

0

Trên Tuyến thay đổi, nó sẽ cuộn lên đầu trang.

 $scope.$on('$routeChangeSuccess', function () {
      window.scrollTo(0, 0);
  });

đặt mã này trên bộ điều khiển của bạn.


0

Trong tâm trí của tôi @slugslog đã có nó, nhưng tôi sẽ thay đổi một điều. Tôi sẽ sử dụng thay thế để bạn không phải đặt lại.

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

Tìm kiếm tài liệu cho "Phương pháp thay thế"


0

Không có giải pháp nào ở trên phù hợp với tôi, nhưng tôi chỉ thử nó, và nó đã hoạt động,

<a href="#/#faq-1">Question 1</a>

Vì vậy, tôi nhận ra rằng tôi cần thông báo cho trang để bắt đầu với trang chỉ mục và sau đó sử dụng neo truyền thống.


0

Đôi khi trong điều hướng băm ứng dụng angularjs không hoạt động và các thư viện javascript bootstrap jquery sử dụng rộng rãi loại điều hướng này, để làm cho nó hoạt động thêm target="_self"vào thẻ neo. ví dụ<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">



0

Tôi đang sử dụng AngularJS 1.3.15 và có vẻ như tôi không phải làm gì đặc biệt.

https://code.angularjs.org/1.3.15/docs/api/ng/provider/ $ anchorScrollProvider

Vì vậy, các công việc sau đây cho tôi trong html của tôi:

<ul>
  <li ng-repeat="page in pages"><a ng-href="#{{'id-'+id}}">{{id}}</a>
  </li>
</ul>
<div ng-attr-id="{{'id-'+id}}" </div>

Tôi hoàn toàn không phải thực hiện bất kỳ thay đổi nào đối với bộ điều khiển hoặc JavaScript của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.