Come gestire il collegamento hash di ancoraggio in AngularJS


318

Qualcuno di voi sa come gestire bene il collegamento hash di ancoraggio in AngularJS ?

Ho il seguente markup per una semplice pagina FAQ

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

Quando si fa clic su uno dei collegamenti sopra indicati, AngularJS intercetta e mi indirizza a una pagina completamente diversa (nel mio caso, una pagina di 404 in quanto non esistono percorsi corrispondenti ai collegamenti.)

Il mio primo pensiero è stato quello di creare un percorso corrispondente " / faq /: capitolo " e nel controller corrispondente controllare $routeParams.chapterdopo un elemento corrispondente e quindi utilizzare jQuery per scorrere verso il basso.

Ma poi AngularJS mi caga di nuovo e scorre comunque fino all'inizio della pagina.

Quindi, qualcuno qui ha fatto qualcosa di simile in passato e conosce una buona soluzione?

Modifica: passare a html5Mode dovrebbe risolvere i miei problemi, ma in qualche modo dobbiamo supportare IE8 + quindi temo che non sia una soluzione accettata: /


Penso che angolare suggerisca di usare ng-href=""invece.
spalle

10
Penso che ng-href sia applicabile solo se l'URL contiene dati dinamici che devono essere associati a un modello ng. Mi chiedo se assegni un hashPrefix a locationProvider se ignorerà il collegamento agli ID: docs.angularjs.org/guide/dev_guide.services.$location
Adam

Adam ha ragione sull'uso di ng-href.
Rasmus,

Possibile duplicato di collegamenti
Michaël Benjamin Saerens,

Questo è anche un problema per il nuovo Angolare: stackoverflow.com/questions/36101756/...
phil294

Risposte:


375

Stai cercando $anchorScroll().

Ecco la documentazione (scadente).

Ed ecco la fonte.

Fondamentalmente lo devi solo iniettare e chiamarlo nel tuo controller, e ti farà scorrere fino a qualsiasi elemento con l'id trovato in $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>

Ecco un plunker per dimostrare

EDIT: per usarlo con il routing

Configura il routing angolare come al solito, quindi aggiungi il seguente codice.

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

e il tuo link sarebbe simile al seguente:

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

Ecco un Plunker che dimostra lo scorrimento con routing e $ anchorScroll

E ancora più semplice:

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

e il tuo link sarebbe simile al seguente:

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

5
Il problema può sorgere quando aggiungi il routing: se aggiungi ngView ogni modifica dell'hash dell'URL attiverà il ricaricamento del percorso ... Nel tuo esempio non c'è routing e l'URL non riflette l'elemento corrente ... Ma grazie per aver puntato a $ anchorScroll
Valentyn Shybanov

1
@blesh, chiamando location.hash (X) cambia la pagina poiché il routing controlla le visualizzazioni.
dsldsl,

24
Questa soluzione provoca il rendering dell'intera applicazione.

2
@dsldsl && @OliverJosephAsh: $ location.hash () non ricaricherà la pagina. Se lo è, c'è qualcos'altro in corso. Ecco lo stesso riquadro con l'ora in cui viene scritta la pagina in fase di caricamento, vedrai che non cambia Se vuoi scorrere fino a un tag di ancoraggio sulla pagina corrente senza ricaricare il percorso, dovresti semplicemente fare un collegamento regolare <a href="#foo">foo</a>. Il mio esempio di codice è stato quello di mostrare lo scorrimento verso un ID su routechange.
Ben Lesh,

4
@blesh: ti consiglio di rimuovere anche l'hash dopo aver fatto scorrere la sezione desiderata, in questo modo l'URL non è inquinato da cose che in realtà non dovrebbero essere lì. Usa questo: $location.search('scrollTo', null)
kumarharsh,

168

Nel mio caso, ho notato che la logica di routing si avviava se avessi modificato il $location.hash(). Il seguente trucco ha funzionato ..

$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
Grazie brillante per questo, la logica di routing si è assolutamente rifiutata di comportarsi anche quando si utilizza la soluzione .run (...) di @ blesh, e questo lo ordina.
ljs

8
Il tuo trucco "salvare il vecchio hash" è stato un vero toccasana. Impedisce il ricaricamento della pagina mantenendo pulito il percorso. Idea fantastica!
ThisLanham,

2
Ben fatto. Ma dopo aver implementato la soluzione, l'URL non aggiorna il valore dell'ID target.
Mohamed Hussain,

1
Ho avuto la stessa esperienza di Mohamed ... In effetti ha fermato la ricarica ma mostra il percorso hashless (e $ anchorScroll non ha avuto effetto). 1.2.6 Hmmmm.
michael

3
Io uso $location.hash(my_id); $anchorScroll; $location.hash(null). Impedisce il ricaricamento e non devo gestire la oldvariabile.
MFB il

53

Non è necessario modificare alcun routing o qualsiasi altra cosa è sufficiente utilizzare target="_self"durante la creazione dei collegamenti

Esempio:

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

E usa l' idattributo nei tuoi elementi html in questo modo:

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

Non è necessario utilizzare ## come indicato / menzionato nei commenti ;-)


1
Questo non ha funzionato per me, ma la soluzione qui ha fatto: stackoverflow.com/a/19367249/633107
Splaktar

6
Grazie per questa soluzione Ma target = "_ self" è sufficiente. Non c'è bisogno di raddoppiare #
Christophe P,

5
target = "_ self" è sicuramente la risposta migliore (non è necessario raddoppiare #, come sottolineato da Christophe P). Funziona indipendentemente dal fatto che Html5Mode sia acceso o spento.
Newman,

3
Semplice e completo Ha funzionato per me senza la necessità di aggiungere un'altra dipendenza angolare.
pronto

4
Questa è la soluzione giusta Non è necessario coinvolgere il servizio angolare $ anchorScroll. Consulta la documentazione per un tag: 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>

Eccezionale! Di gran lunga la soluzione più semplice, ma hai idea di come collegarti a un'ancora su una pagina separata? (ie / prodotti # libri)
8bithero

Penso che sia la stessa della soluzione (/ products ## books) in AngularJS
lincolnge,

1
Dalla mia esperienza, href = "##" funziona solo quando viene iniettato $ anchorScroll.
Brian Park,

9
questo sembra relativamente semplice ma non funziona :-(
brykneval

4
Ho aggiunto target = "_ self" e ha funzionato a meraviglia per tutti i tipi di navigazione all'interno della pagina (leggi i cursori, passa a sezioni diverse e così via). Grazie per aver condiviso questo grande e semplice trucco.
Kumar Nitesh,

19

Se conosci sempre il percorso, puoi semplicemente aggiungere l'ancora in questo modo:

href="#/route#anchorID

dove si routetrova il percorso angolare corrente e anchorIDcorrisponde a un punto <a id="anchorID">della pagina


1
Ciò innesca un normale cambio di rotta AngularJS ed è quindi scoraggiato. Nel mio caso è stato molto visivo poiché i video di YouTube nella pagina FAQ / Guida sono stati ricaricati.
Robin Andersson,

9
@ RobinWassén-Andersson specificando reloadOnSearch: falsetale percorso nella configurazione dei percorsi, angolare non attiverà una modifica del percorso e scorrerà semplicemente verso l'id. In combinazione con il percorso completo specificato nel atag, direi che questa è la soluzione più semplice e diretta.
Elise,

Grazie. Questo mi ha aiutato. Non uso alcun percorso personalizzato nella mia app, quindi fare un href = "# / # anchor-name" ha funzionato alla grande!
Giordania,

14

$anchorScroll funziona per questo, ma c'è un modo molto migliore per usarlo nelle versioni più recenti di Angular.

Ora $anchorScrollaccetta l'hash come argomento facoltativo, quindi non devi cambiare $location.hashnulla. ( documentazione )

Questa è la soluzione migliore perché non influisce affatto sul percorso. Non sono riuscito a far funzionare nessuna delle altre soluzioni perché sto usando ngRoute e il percorso si ricaricherebbe non appena ho impostato $location.hash(id), prima che $anchorScrollpotesse fare la sua magia.

Ecco come usarlo ... prima, nella direttiva o nel controller:

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

e quindi nella vista:

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

Inoltre, se devi tenere conto di una barra di navigazione fissa (o altra interfaccia utente), puoi impostare l'offset per $ anchorScroll in questo modo (nella funzione di esecuzione del modulo principale):

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

Grazie. Come implementeresti la tua strategia per un collegamento hash combinato con un cambio di rotta? Esempio: fare clic su questo elemento di navigazione, che apre una vista diversa e scorre verso il basso fino a uno specifico idin quella vista.
Kyle Vassella,

Mi dispiace infastidire ... Se hai la possibilità di dare un'occhiata alla mia domanda Stack? Sento che la tua risposta qui mi ha avvicinato così tanto ma non riesco proprio a implementarla: stackoverflow.com/questions/41494330/… . Anch'io sto usando ngRoutee la versione più recente di Angular.
Kyle Vassella,

Mi dispiace di non aver provato quel caso particolare ... ma hai dato un'occhiata a $ location.search () o $ routeParams ? Forse potresti usare l'uno o l'altro durante l'inizializzazione del tuo controller - se il tuo scrollTo per cercare il parametro è nell'URL, allora il controller potrebbe usare $ anchorScroll come sopra per scorrere la pagina.
Rebecca,

2
Passando l'ID direttamente a $ anchorScroll, i miei percorsi sono cambiati da qualcosa come / contact # contact a just / contact. Questa dovrebbe essere la risposta accettata imho.
RandomUs1r

12

Questa è stata la mia soluzione usando una direttiva che sembra più angolare perché abbiamo a che fare con il DOM:

Plnkr qui

github

CODICE

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>

Ho usato il servizio $ anchorScroll. Per contrastare l'aggiornamento della pagina associato alla modifica dell'hash, sono andato avanti e ho annullato l'evento locationChangeStart. Questo ha funzionato per me perché avevo una pagina di aiuto collegata a un interruttore ng e gli aggiornamenti avrebbero interrotto in modo essenziale l'app.


Mi piace la tua soluzione direttiva. Tuttavia, come lo faresti, volevi caricare un'altra pagina e scorrere fino alla posizione di ancoraggio allo stesso tempo. Senza angularjs sarebbe nomicamente href = "location # hash". Ma la tua direttiva impedisce il ricaricamento della pagina.
CMCDragonkai,

@CMCDragonkai con la mia direttiva, non sono sicuro perché utilizzo la chiamata a $ anchorScroll, che sembra gestire solo lo scorrimento di un elemento attualmente nella pagina. Potrebbe essere necessario pasticciare con $ location o $ window per ottenere qualcosa che comporta un cambio di pagina.
KhalilRavanna,

2
Devi annullare l'iscrizione all'evento locationChangeStart: var off = scope. $ On ('$ locationChangeStart', function (ev) {off (); ev.preventDefault ();});

Buona cattura @EugeneTskhovrebov, sono andato avanti e l'ho aggiunto alla risposta in una modifica.
KhalilRavanna,

5

Prova a impostare un prefisso hash per percorsi angolari $locationProvider.hashPrefix('!')

Esempio completo:

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

Ciò non influisce sul risultato. Sarebbe dolce però.
Rasmus,

2
Sei sicuro. Perché non funziona? Se il prefisso hash è!, Allora il routing hash dovrebbe essere la pagina #! Pertanto AngularJS dovrebbe rilevare quando è solo un #hash, dovrebbe ancora scorrere automaticamente e funzionare sia per gli URL in modalità HTML5 che per quelli in modalità hash.
CMCDragonkai,

5

L'ho aggirato nella logica del percorso per la mia app.

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
Questo non funziona: Errore: [$ injector: modulerr] Impossibile istanziare l'angolo del modulo a causa di: Errore: "gestore" non valido in quando ()
geoidesic

5

Questo è un vecchio post, ma ho passato molto tempo a cercare varie soluzioni, quindi volevo condividerne uno più semplice. L'aggiunta target="_self"al <a>tag l'ha risolto per me. Il collegamento funziona e mi porta nella posizione corretta sulla pagina.

Tuttavia, Angular inietta ancora qualche stranezza con il # nell'URL, quindi potresti avere problemi usando il pulsante Indietro per la navigazione e simili dopo aver usato questo metodo.


4

Questo potrebbe essere un nuovo attributo per ngView, ma sono stato in grado di farlo funzionare con i collegamenti hash di ancoraggio angular-routeusando l' ngView autoscrollattributo e "double hash".

ngView (vedi autoscroll)

(Il seguente codice è stato utilizzato con cinghia angolare)

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

Potrei farlo in questo modo:

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

2

Ecco una sorta di soluzione alternativa sporca creando una direttiva personalizzata che scorrerà all'elemento specificato (con "faq" hardcoded)

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


Funziona davvero, ma è, come hai detto, sporco. Molto sporco. Vediamo se qualcun altro può trovare una soluzione più carina, o dovrò andare con questo.
Rasmus,

Angular ha già la funzionalità scrollTo integrata in $anchorScroll, vedi la mia risposta.
Ben Lesh,

Modificato il plunker per essere meno sporco: usa $ location.path () quindi non c'è "faq" hardcoded nel sorgente. E ho anche provato a usare $ anchorScroll, ma sembra che a causa del routing non funzioni ...
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

Se non ti piace usare ng-clickecco una soluzione alternativa. Utilizza a filterper generare l'URL corretto in base allo stato corrente. Il mio esempio usa ui.router .

Il vantaggio è che l'utente vedrà dove passa il collegamento al passaggio del mouse.

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

Il filtro:

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

2

La mia soluzione con ng-route era questa semplice direttiva:

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

L'html è simile a:

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

Non dovresti specificare l'attributo like scroll-to="yourid"e nominare la direttiva scrollTo(e accedere all'attributo as attrs["scrollTo"]? Inoltre, senza esplicitare l'inclusione di jQuery, il gestore deve essere associato element.on('click', function (e) {..}).
Theodros Zelleke,

1

Potresti provare a usare anchorScroll .

Esempio

Quindi il controller sarebbe:

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

E la vista:

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

... e nessun segreto per l'ID di ancoraggio:

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

1

Stavo cercando di far scorrere la mia app Angular fino al caricamento di un tassello di ancoraggio e ho incontrato le regole di riscrittura dell'URL di $ routeProvider.

Dopo una lunga sperimentazione mi sono deciso su questo:

  1. registra un gestore di eventi document.onload dalla sezione .run () del modulo dell'app Angular.
  2. nel gestore scopri cosa avrebbe dovuto essere l'originale tag di ancoraggio facendo alcune operazioni sulle stringhe.
  3. sovrascrivi location.hash con il tag di ancoraggio rimosso (che fa sì che $ routeProvider lo sovrascriva immediatamente con la sua regola "# /". Ma va bene, perché Angular è ora sincronizzato con ciò che sta accadendo nell'URL 4) chiama $ 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

Non sono sicuro al 100% se funziona sempre, ma nella mia applicazione questo mi dà il comportamento previsto.

Diciamo che sei sulla pagina INFORMAZIONI E che hai il seguente percorso:

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

Ora, nel tuo HTML

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

In conclusione

Includere il nome della pagina prima dell'ancora ha fatto il trucco per me. Fammi sapere dei tuoi pensieri.

Svantaggio

Ciò ridistribuirà la pagina e quindi scorrerà fino all'ancoraggio.

AGGIORNARE

Un modo migliore è aggiungere quanto segue:

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

1

Ottieni facilmente la tua funzione di scorrimento. Supporta anche lo scorrimento animato / uniforme come funzionalità aggiuntiva. Dettagli per la libreria Angular Scroll :

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

Bower :bower install --save angular-scroll

npm :npm install --save angular-scroll

Versione ridotta - solo 9kb

Scorrimento regolare (scorrimento animato) - sì

Scroll Spy - sì

Documentazione - eccellente

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

Spero che questo ti aiuti.


1

Sulla base di @Stoyan ho trovato la seguente soluzione:

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

Al cambio del percorso, scorrerà fino all'inizio della pagina.

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

inserisci questo codice sul tuo controller.


0

Nella mia mente @slugslog ce l'aveva, ma avrei cambiato una cosa. Vorrei invece sostituire, quindi non è necessario ripristinarlo.

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

Ricerca documenti per "Sostituisci metodo"


0

Nessuna delle soluzioni sopra funziona per me, ma ho appena provato questo e ha funzionato,

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

Quindi mi sono reso conto che ho bisogno di avvisare la pagina per iniziare con la pagina dell'indice e quindi utilizzare l'ancoraggio tradizionale.


0

A volte nella navigazione dell'hash dell'applicazione angularjs non funziona e le librerie javery jquery di bootstrap fanno ampio uso di questo tipo di navigazione, per farlo funzionare aggiungere target="_self"al tag anchor. per esempio<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">



0

Sto usando AngularJS 1.3.15 e sembra che non debba fare nulla di speciale.

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

Quindi, il seguente funziona per me nel mio HTML:

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

Non ho dovuto apportare alcuna modifica al mio controller o JavaScript.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.