2013-12-17 1 views
14

ho una visione in cui ho il seguente codice:

<input type="button" value="New Post" ng-click="$state.go('blog.new-post')"> 

L'obiettivo è quello di transizione verso un nuovo stato, senza dover usa href. Sfortunatamente il codice sopra non fa fuoco.

Ho anche cercato di includere $ Stato nel controller per questa vista:

app.controller('blogPostsController', function($scope, $stateParams, $http, $state) ... 

Ma ancora niente. la transizione anche non sembra funzionare.

Qualcuno ha qualche idea su come fare questo lavoro?

EDIT: ho potuto solo farlo funzionare assegnando:

$scope.$state = $state; 

dentro il mio controller. Questo sembra brutto. Non c'è davvero nessun altro modo per accedere a $ stato senza assegnarlo all'ambito?

risposta

11

Secondo https://github.com/angular-ui/ui-router/wiki/Quick-Reference#note-about-using-state-within-a-template è possibile aggiungerlo a $rootScope, in modo che sarà disponibile in tutti gli ambiti e, quindi, tutti i modelli, dalla

angular.module("myApp").run(function ($rootScope, $state, $stateParams) { 
    $rootScope.$state = $state; 
    $rootScope.$stateParams = $stateParams; 
}); 
+2

E 'generalmente considerato cattiva pratica di aggiungere proprietà come questo per il $ rootScope. – jkjustjoshing

+3

In una situazione in cui hai davvero bisogno di qualcosa di simile (questa situazione non lo richiede - vedi la mia risposta), un'opzione migliore è creare una direttiva leggera che accetta un valore di attributo e $ lo analizza nel contesto della dipendenza . – jkjustjoshing

43

Se si utilizza ui-router v'è un attributo chiamato ui-sref che possono essere utilizzato come segue:

<a ui-sref="blog.new-post"></a> 

vi consiglio di usare quello e lo styling il collegamento come un pulsante (può facilmente essere fatto se si sta utilizzando una libreria di CSS come Twitter Bootstrap). Quindi non è necessario fare confusione con JavaScript durante la scrittura dei collegamenti.

Se è necessario passare un parametro nello stato, è possibile effettuare le seguenti operazioni:

<a ui-sref="blog.edit-post({id: item.id})"></a> 

dove $ scope.item è un oggetto con una proprietà ID che si desidera essere passato come parametro URL.

+2

methinks questa dovrebbe essere la risposta accettata .. ovviamente, non sarai in grado di passare i parametri allo stato in questo modo. – RoyM

+3

@roymath, in realtà è possibile! La risposta è stata modificata. – jkjustjoshing

+2

Grazie - questo lo rende davvero bello .. una delle cose che ho anche capito è che puoi modificare parte di un percorso URL in modo molto elegante - cioè: essenzialmente navigando all'interno dello stato. Esempio: hai un URL per uno stato 'S' come questo:'/foo /: aa /: bb /: cc' Se sei già in quello stato con un percorso come '/ foo/joe/blow/rocks' e vuoi cambiare 'blow' in' sixpack' ma lasciare il resto da solo, è solo questione di avere 'ui-sref = "S ({bb:' sixpack '})" '- senza preoccuparsi sugli altri parametri. Questo sarebbe più difficile se si provasse a modificare '$ location.path' direttamente – RoyM

0

più semplice soluzione è quella di utilizzare $ Finestra Servizio e vecchio approccio

  1. Inject $ finestra servizio di JS angolare.
  2. Utilizzare la funzione history.back() di javascript.
  3. Fatto, è la soluzione più semplice se si vuole solo tornare indietro.

Non scriverò JS tutto angolare.Solo il codice che conta:

codice HTML

<button ng-click="$ctrl.goBack()">Go Back</button> 

JS-Code

self.goBack = function(){ $window.history.back(); };