AngularJS'de çapa karma bağlantısını işleme


318

AngularJS çapa karma bağlantı güzel nasıl idare biliyor musunuz ?

Basit bir SSS sayfası için aşağıdaki biçimlendirmeye sahibim

<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>

Yukarıdaki bağlantılardan herhangi birine tıkladığınızda AngularJS araya girer ve beni tamamen farklı bir sayfaya yönlendirir (benim durumumda, bağlantılarla eşleşen rota olmadığı için 404 sayfalık bir sayfa).

İlk düşüncem " / faq /: bölüm " ile eşleşen bir rota oluşturmak ve $routeParams.chaptereşleşen bir elemandan sonra eşleşen bir denetleyiciyi kontrol etmek ve ardından aşağıya kaydırmak için jQuery kullanmaktı.

Ama sonra AngularJS bana tekrar bakıyor ve yine de sayfanın üst kısmına kaydırıyor.

Öyleyse, burada kimse geçmişte benzer bir şey yaptı ve buna iyi bir çözüm biliyor mu?

Edit: html5Mode geçiş benim sorunları çözmek gerekir ama biz zaten kabul bir çözüm değil korkuyorum IE8 + yine de desteklemek zorunda: /


Bunun ng-href=""yerine açısal kullanmayı önerir .
Sırtıma

10
Ben ng-href sadece url bir ng-modeline bağlanması gereken dinamik veri içeriyorsa uygulanabilir olduğunu düşünüyorum. LocationProvider'a bağlantının kimlikleri göz ardı edip etmeyeceğini merak ediyorum: docs.angularjs.org/guide/dev_guide.services.$location
Adam

Adam ng-href kullanımı konusunda haklı.
Rasmus


Bu aynı zamanda yeni Angular için de bir sorun: stackoverflow.com/questions/36101756/…
phil294

Yanıtlar:


375

Arıyorsunuz $anchorScroll().

İşte (boktan) belgeler.

Ve işte kaynak.

Temel olarak sadece enjekte edip kumandanıza çağırıyorsunuz ve sizi kimliğinde bulunan herhangi bir öğeye kaydırıyor $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>

İşte göstermek için bir dalgıç

EDIT: yönlendirme ile kullanmak için

Açısal yönlendirmenizi her zamanki gibi ayarlayın, ardından aşağıdaki kodu ekleyin.

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();  
  });
});

ve bağlantınız şöyle görünür:

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

İşte yönlendirme ve $ anchorScroll ile kaydırmayı gösteren bir Plunker

Ve daha da basit:

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();  
  });
});

ve bağlantınız şöyle görünür:

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

5
Yönlendirme eklediğinizde sorun gelebilir: ng eklerseniz url'nin karma değerinin her değişmesi rota yeniden yüklemesini tetikler ... Örneğinizde yönlendirme yoktur ve url geçerli öğeyi yansıtmaz ... Ama $ anchorScroll
Valentyn Shybanov'u

1
@blesh, location.hash (X) çağrısı, yönlendirme görünümleri kontrol ettiğinden sayfayı değiştirir.
dsldsl

24
Bu çözüm tüm uygulamamın yeniden oluşturulmasına neden oluyor.

2
@dsldsl && @OliverJosephAsh: $ location.hash () sayfayı yeniden yüklemez. Eğer öyleyse, başka bir şey oluyor. Burada, sayfa yüklenirken yazılan zamanla aynı numara var, değişmeyeceğini göreceksiniz . Geçerli sayfada bir bağlantı etiketine ilerlemek için rotayı yeniden yüklemeden, düzenli bağlantı <a href="#foo">foo</a>. Kod örneğim, rutechange üzerindeki bir kimliğe kaydırmayı göstermekti.
Ben Lesh

4
@blesh: İstediğiniz bölüme geçtikten sonra hash'ı da kaldırmanızı öneririm, bu şekilde URL gerçekten orada olmaması gereken şeylerle kirlenmez. Bunu kullanın: $location.search('scrollTo', null)
kumarharsh

168

Benim durumumda, yönlendirme mantığının modifiye edersem tekme olduğunu fark ettim $location.hash(). Aşağıdaki hile işe yaradı ..

$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
Bunun için harika teşekkürler, yönlendirme mantığı @ blesh'ın .run (...) çözümünü kullanırken bile kesinlikle davranmayı reddetti ve bu onu sıralıyor.
ljs

8
"Eski karmaşayı kurtarmak" hileniz mutlak bir cankurtaran olmuştur. Rotayı temiz tutarken sayfanın yeniden yüklenmesini önler. Harika fikir!
ThisLanham

2
Güzel bir. Ancak çözümünüzü uyguladıktan sonra URL, hedef kimliğin değerini güncellemiyor.
Mohamed Hussain

1
Ben Mohamed ile aynı deneyime sahipti ... Gerçekten yeniden yüklemeyi durdurdu ama karma yol gösterir (ve $ anchorScroll hiçbir etkisi yoktu). 1.2.6 Hmmmm.
michael

3
Ben kullanıyorum $location.hash(my_id); $anchorScroll; $location.hash(null). Yeniden yüklemeyi önler ve olddeğişkeni yönetmek zorunda değilim .
MFB

53

Kullanımdan hemen gereken herhangi yönlendirme veya başka bir şey değiştirmeye gerek yoktur target="_self"bağlantıları oluştururken

Misal:

<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>

Ve bu idözelliği html öğelerinizde şu şekilde kullanın:

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

Yorumlarda ;-) belirtilen / belirtilen şekilde ## kullanmaya gerek yoktur.


1
Bu benim için işe yaramadı, ancak buradaki çözüm işe yaradı: stackoverflow.com/a/19367249/633107
Splaktar

6
Bu çözüm için teşekkürler. Ancak target = "_ self" yeterlidir. # Çifte gerek yok
Christophe P

5
target = "_ self" kesinlikle en iyi cevaptır (Christophe P'nin işaret ettiği gibi # 'i ikiye katlamaya gerek yoktur). Html5Mode açık veya kapalı olursa olsun bu işe yarar.
newman

3
Basit ve eksiksiz. Başka bir açısal bağımlılık eklemeye gerek kalmadan benim için çalıştı.
adeady

4
Bu doğru çözüm. Açısal $ anchorScroll hizmetine gerek yoktur. Bir etiketin belgelerine bakın: https://developer.mozilla.org/en/docs/Web/HTML/Element/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>

Müthiş! Şimdiye kadar en basit çözüm, ancak ayrı bir sayfada bir çapa nasıl bağlanacağı hakkında herhangi bir fikir? (ör. / ürünler # kitaplar)
bithero

AngularJS'deki çözümle (/ products ## books) aynı olduğunu düşünüyorum
lincolnge

1
Deneyimlerime göre, href = "##" yalnızca $ anchorScroll enjekte edildiğinde çalışır.
Brian Park

9
Bu nispeten basit görünüyor ama çalışmıyor :-(
brykneval

4
Target = "_ self" i ekledim ve sayfadaki tüm gezinme türleri için cazibe gibi çalıştı (kaydırıcıları oku, farklı bölümlere gitme vb.). Bu harika ve en basit numarayı paylaştığınız için teşekkür ederiz.
Kumar Nitesh

19

Rotayı her zaman biliyorsanız, sabitlemeyi şu şekilde ekleyebilirsiniz:

href="#/route#anchorID

routegeçerli açısal rota nerede ve sayfadaki anchorIDbir <a id="anchorID">yerle eşleşiyor


1
Bu normal bir AngularJS yol değişikliğini tetikler ve bu nedenle önerilmez. Benim durumumda, SSS / Yardım sayfasındaki YouTube videolarının yeniden yüklenmesi nedeniyle çok görseldi.
Robin Andersson

9
@ RobinWassén-Andersson reloadOnSearch: falserota yapılandırmanızda bu rota için belirterek , açısal bir rota değişikliğini tetiklemez ve sadece kimliğe kaydırır. aEtikette belirtilen tam rota ile birlikte, bunun en basit ve en basit çözüm olduğunu söyleyebilirim.
Elise

Teşekkür ederim. Bu bana yardımcı oldu. Uygulamamda herhangi bir özel rota kullanmıyorum, bu yüzden bir href = "# / # anchor-name" yapmak harika çalıştı!
Ürdün

14

$anchorScroll bunun için çalışır, ancak Angular'ın daha yeni sürümlerinde kullanmanın çok daha iyi bir yolu vardır.

Şimdi, $anchorScrollhash'ı isteğe bağlı bir argüman olarak kabul eder, bu yüzden değiştirmeniz gerekmez$location.hash . ( dokümantasyon )

Bu en iyi çözümdür çünkü rotayı hiç etkilemez. Çalışmak için diğer çözümlerden hiçbirini alamadım çünkü ngRoute kullanıyorum ve ayarladığım anda rota yeniden yüklenecek$location.hash(id) , $anchorScrollsihrini yapmadan önce .

İşte nasıl kullanılacağı ... ilk olarak, direktif veya kontrolörde:

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

ve sonra görünümde:

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

Ayrıca, sabit bir gezinme çubuğunu (veya başka bir kullanıcı arayüzünü) hesaba katmanız gerekirse, $ anchorScroll için ofseti şu şekilde ayarlayabilirsiniz (ana modülün çalışma işlevinde):

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

Teşekkürler. Rota değişikliği ile birlikte karma bağlantı için stratejinizi nasıl uygularsınız? Örnek: Farklı bir görünüm açan ve ido görünümde belirli bir öğeye kaydırılan bu gezinme öğesini tıklayın .
Kyle Vassella

Şımarmak için sry .. Bir şansın olursa Stack soruma bir bakış verebilir misin? Cevabın beni bu kadar yaklaştırdığını hissediyorum ama uygulayamıyorum: stackoverflow.com/questions/41494330/… . Ben de ngRouteAngular'ın yeni sürümünü kullanıyorum .
Kyle Vassella

Üzgünüm, bu özel durumu denemedim ... ama $ location.search () veya $ routeParams'a bir göz attınız mı? Denetleyicinizin başlatılmasında birini veya diğerini kullanabilirsiniz - scrollTo arama parametreniz URL'deyse, denetleyici sayfayı kaydırmak için yukarıdaki gibi $ anchorScroll kullanabilir.
Rebecca

2
Kimliği doğrudan $ anchorScroll'e geçirerek, rotalarım / contact # contact gibi bir şeyden just / contact olarak değiştirildi. Bu kabul edilen cevap imho olmalıdır.
RandomUs1r

12

Bu, DOM ile uğraştığımız için daha Angular-y gibi görünen bir direktif kullanarak çözümümdü:

Buraya gel

github

KOD

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>

$ AnchorScroll hizmetini kullandım. Karma değiştirme ile birlikte giden sayfa yenilemesine karşı koymak için devam ettim ve locationChangeStart olayını iptal ettim. Bir ng-switch bağladım bir yardım sayfası vardı ve yenileme esentially uygulamayı kıracaktı çünkü bu benim için çalıştı.


Direktif çözümünüzü seviyorum. Ancak bunu nasıl yaparsınız, aynı anda başka bir sayfa yüklemek ve bağlantı konumuna gitmek istersiniz. Açısallar olmadan href = "location # hash" olurdu. Ancak direktifiniz sayfanın yeniden yüklenmesini engelliyor.
CMCDragonkai

@CMCDragonkai direktifimle, emin değilim çünkü sadece şu anda sayfada bulunan bir öğeye kaydırmayı işleyen $ anchorScroll çağrısını kullanıyorum. Sayfa değişikliği içeren bir şey almak için $ location veya $ window ile uğraşmanız gerekebilir .
KhalilRavanna

2
LocationChangeStart olayından çıkmanız gerekir: var off = scope. $ On ('$ locationChangeStart', function (ev) {off (); ev.preventDefault ();});

@EugeneTskhovrebov iyi yakaladım, devam ettim ve bir düzenlemede cevaba ekledim.
KhalilRavanna

5

Açısal yollar için bir karma önek ayarlamaya çalışın $locationProvider.hashPrefix('!')

Tam örnek:

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

Bu sonucu etkilemez. Yine de tatlı olurdu.
Rasmus

2
Emin misiniz. Bu neden çalışmıyor? Karma önek! İse, karma yönlendirme #! Sayfa olmalıdır. Bu nedenle AngularJS, yalnızca #hash olduğunda algılamalı, otomatik olarak kaydırmayı tutturmalı ve hem HTML5 modu URL'leri hem de karma modu URL'leri için çalışmalıdır.
CMCDragonkai

5

Uygulamam için rota mantığında bu sorunu çözdüm.

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
Bu işe yaramaz: Hata: [$ injector: modulerr] Nedeniyle modül açısı somutlaştırılamadı: Hata: ()
geoidesic

5

Bu eski bir yazı, ancak uzun zamandır çeşitli çözümleri araştırdım, bu yüzden bir tane daha basit olanı paylaşmak istedim. Sadece ekleyerek target="_self"için <a>etiketi benim için düzelttim. Bağlantı çalışıyor ve beni sayfadaki doğru konuma götürüyor.

Bununla birlikte, Angular URL'deki # ile hala bir tuhaflık enjekte eder, bu nedenle gezinme için geri düğmesini ve bu yöntemi kullandıktan sonra böyle bir sorunla karşılaşabilirsiniz.


4

Bu ngView için yeni bir özellik olabilir, ancak öznitelik ve 'çift karma' angular-routekullanarak çalışmak için çapa karma bağlantıları elde edebildim ngView autoscroll.

ngView (otomatik kaydırmaya bakın)

(Açılı kayış ile aşağıdaki kod kullanılmıştır)

<!-- 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

Bunu şöyle yapabilirdim:

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

2

Belirtilen öğeye kaydırılacak özel yönerge oluşturarak (sabit kodlu "SSS" ile) bir tür kirli çözüm var

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


Bu gerçekten işe yarıyor, ama dediğin gibi kirli. Çok kirli. Bakalım başka biri daha güzel bir çözüm bulabilir mi, yoksa bununla gitmek zorunda kalacağım.
Rasmus

Açısal zaten scrollTo işlevini yerleşik olarak içeriyor $anchorScroll, cevabımı görün.
Ben Lesh

Piston daha az kirli olarak değiştirildi: $ location.path () kullanır, böylece kaynakta sabit kodlu "SSS" yoktur. Ve ayrıca $ anchorScroll kullanmaya çalıştı, ancak yönlendirme nedeniyle çalışmıyor ...
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

Kullanmak istemiyorsanız ng-clickalternatif bir çözüm. filterGeçerli duruma göre doğru url'yi oluşturmak için a kullanır . Örneğim ui.router kullanıyor .

Bunun yararı, kullanıcının bağlantının nereye gittiğini görmesidir.

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

Filtre:

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

2

Ng-route ile çözümüm bu basit direktifti:

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

Html şöyle görünüyor:

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

Eğer böyle niteliğini belirtmek zorunda olmaz scroll-to="yourid"ve direktifi isim scrollTo(ve erişiminin yanı niteliği attrs["scrollTo"]ile bağlı olmayı ettiği açık jQuery dahil edilmeksizin, işleyici yanında oldu? element.on('click', function (e) {..}).
Theodros Zelleke

1

AnchorScroll'u kullanmayı deneyebilirsiniz .

Misal

Yani kontrolör şöyle olurdu:

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

Ve görüş:

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

... ve bağlantı kimliği için sır yok:

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

1

Angular uygulamamı bir çapa opon yüklemesine kaydırmaya çalışıyordum ve $ routeProvider'ın URL yeniden yazma kurallarına koştum.

Uzun deneylerden sonra buna karar verdim:

  1. Angular uygulama modülünün .run () bölümünden bir document.onload olay işleyicisi kaydedin.
  2. işleyicide, bazı dize işlemleri yaparak orijinalin ankraj etiketinin ne olması gerektiğini öğrenin.
  3. stripped down anchor tag ile location.hash'i geçersiz kıl ($ routeProvider'ın hemen "# /" kuralıyla tekrar üzerine yazmasına neden olur. Ama sorun değil, çünkü Angular artık URL 4'te neler olduğu ile senkronize) $ anchorScroll ().

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

Bunun her zaman çalışıp çalışmadığından% 100 emin değilim, ancak uygulamamda bu beklenen davranışı veriyor.

Diyelim ki HAKKINDA sayfasındasınız ve aşağıdaki rotanız var:

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

Şimdi, HTML'de

<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>

Sonuç olarak

Çapadan önce sayfa adını eklemek benim için hile yaptı. Düşüncelerinizi bana bildirin.

Dezavantaj

Bu, sayfayı yeniden oluşturur ve ardından bağlantıya geçer.

GÜNCELLEME

Daha iyi bir yol aşağıdakileri eklemektir:

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

1

Kaydırma özelliğinizi kolayca alın. Ek bir özellik olarak Animasyonlu / Düzgün kaydırmayı da destekler . Açısal Kaydırma kütüphanesi için detaylar :

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

Bower :bower install --save angular-scroll

npm :npm install --save angular-scroll

Küçültülmüş versiyon - sadece 9kb

Yumuşak Kaydırma (hareketli kaydırma) - evet

Casus Kaydırma - evet

Dokümantasyon - mükemmel

Demo - http://oblador.github.io/angular-scroll/

Bu yardımcı olur umarım.


1

@Stoyan'a dayanarak aşağıdaki çözümü buldum:

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

Rota değişikliğinde sayfanın en üstüne kaydırılır.

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

bu kodu kontrolörünüze koyun.


0

Aklımda @slugslog vardı, ama bir şeyi değiştirirdim. Bunun yerine replace kullanacağım, böylece geri ayarlamak zorunda değilsiniz.

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

"Yöntemi değiştir" için Google Dokümanlar Ara


0

Yukarıdaki çözümlerin hiçbiri benim için çalışmıyor, ama bunu denedim ve işe yaradı,

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

Bu yüzden indeks sayfasıyla başlamak için sayfayı bilgilendirmem ve sonra geleneksel çapayı kullanmam gerektiğini fark ettim.


0

Angularjs uygulama karma navigasyon bazen çalışmıyor ve bootstrap jquery javascript kütüphaneleri, target="_self"çapa etiketine eklemek için , bu tür gezinme işlemlerini kapsamlı bir şekilde kullanır . Örneğin<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">



0

AngularJS 1.3.15 kullanıyorum ve özel bir şey yapmak zorunda değilim gibi görünüyor.

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

Yani, benim html benim için aşağıdaki çalışır:

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

Denetleyicimde veya JavaScript'te hiç değişiklik yapmak zorunda kalmadım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.