2013-04-06 5 views
38

In angularjs, voglio usare button in questo modo, ma ho ancora bisogno di cercare il pulsante.C'è un modo semplice per usare il pulsante per navigare nella pagina come un link in angularjs

<button href="#/new-page.html">New Page<button> 

Come a (link) fa

<a href="#/new-page.html">New Page</a> 

c'è un modo più semplice di questo?

<button ng-click="newPage()">New Page<button> 
$scope.newPage = function(){ 
    location.href = '#/new-page.html'; 
}; 

Nota: Acutally, quando ho usato per location.href per la navigazione, il tutto viene aggiornata e la navigazione non è sotto il controllo di angularjs. Se non utilizzo il collegamento, come navigare nella pagina in codice javascript?

Devo creare una direttiva personalizzata per inserirla?

risposta

63

Il tuo ngClick è corretto; hai solo bisogno del servizio giusto. $location è quello che stai cercando. Controlla la documentazione per tutti i dettagli, ma la soluzione alla tua domanda specifica è questo:

$location.path('/new-page.html'); 

Il servizio $location aggiungerà il cancelletto (#) se è appropriato in base alle impostazioni correnti e garantire senza ricaricare la pagina si verifica .

Si potrebbe anche fare qualcosa di più flessibile, con una direttiva, se così scelto:

.directive('goClick', function ($location) { 
    return function (scope, element, attrs) { 
    var path; 

    attrs.$observe('goClick', function (val) { 
     path = val; 
    }); 

    element.bind('click', function() { 
     scope.$apply(function() { 
     $location.path(path); 
     }); 
    }); 
    }; 
}); 

E allora si potrebbe utilizzare su qualsiasi cosa:

<button go-click="/go/to/this">Click!</button> 

Ci sono molti modi per migliorare questa direttiva; è solo per mostrare cosa si potrebbe fare. Ecco un Plunker che lo dimostra in azione: http://plnkr.co/edit/870E3psx7NhsvJ4mNcd2?p=preview.

+40

Perché sulla terra non è questo built-in? – Kevin

+0

la chiave per me era il tidbit di cui sopra circa il servizio $ location aggiungendo in # automaticamente. rimuoverlo dal mio nuovo percorso di navigazione era la correzione di cui avevo bisogno. – icfantv

+1

Non è necessario per $ observer un parametro stringa. Se si trattasse di un'interpolazione come "go-click = {{path}}", allora dovresti osservarlo. Quindi l'intero blocco $ observ dovrebbe essere rimosso dal tuo esempio. Basta passare 'attrs.goClick' al $ posizione e questo è il –

15

Se stai bene con un po 'di sporcizia, potresti farlo nel modo più semplice e avvolgere il tuo <button> con un ancoraggio (<a>).

<a href="#/new-page.html"><button>New Page<button></a> 

Inoltre, non c'è nulla ti impedisce di styling un link di ancoraggio per assomigliare ad un <button>


come sottolineato nei commenti di @tronman, this is not technically valid html5, ma non dovrebbe causare alcun problemi nella pratica

+3

Purtroppo, l'annidamento di un tag di ancoraggio all'interno di un tag del pulsante non è HTML5 valido. http://stackoverflow.com/questions/6393827/can-i-est-a-button-element-inside-an-a-using-html5 – tronman

+0

@tronman ringrazia per aver segnalato questo problema (anche se probabilmente intendevi dire "annidamento" un bottone dentro un ancoraggio ... "). Questa opzione non è la più pulita, né la migliore forse, ma funziona *, valido html5 o no. Ho scoperto che non ottieni molti benefici dal seguire la lettera della legge con questo genere di cose, e dubitiamo che i venditori di browser lo faranno mai, ma cose del genere non funzionano comunque. –

+0

Sì, ho cambiato i miei tag. Hai ragione ... probabilmente non si romperà in futuro. – tronman

6
<a type="button" href="#/new-page.html" class="btn btn-lg btn-success" >New Page</a> 

semplice ...

+4

prevede un tipo mime, pertanto il "pulsante" non è valido. – netbrain

+2

Vale la pena sottolineare che questa soluzione richiede anche Bootstrap, una dipendenza piuttosto seria –

10

È possibile anche registrarsi $ posizione sul campo di applicazione nel controller (per renderlo accessibile da HTML)

angular.module(...).controller("...", function($location) { 
    $scope.$location = $location; 
    ... 
}); 

e poi proseguire per il miele nel tuo html:

<button ng-click="$location.path('#/new-page.html')">New Page<button> 
14

Con bootstrap puoi usare

<a href="#/new-page.html" class="btn btn-primary"> 
    Click 
</a> 
0
<button type="button" href="location.href='#/nameOfState'">Title on button</button> 

Ancora più semplice ... (notare le virgolette che racchiudono l'indirizzo)

Problemi correlati