Impossibile ottenere parametri di stato del router ui-router
-
21-12-2019 - |
Domanda
Considera la seguente configurazione dell'interfaccia utente:
$stateProvider
.state('app', {
url: "/app",
abstract: true,
templateUrl: "templates/menu.html",
controller: 'AppCtrl'
})
.state('app.feed', {
url: "/feed",
views: {
'menuContent': {
templateUrl: "templates/feed.html",
controller: "FeedCtrl"
}
}
})
.
Ho il seguente link nella mia app:
<a ui-sref="app.feed({ feedId: 5 })">My Link</a>
.
Sto cercando di ottenere il feedId
in parametri di stato:
angular.module('MyApp').controller('FeedCtrl', function($state) {
console.log($state.params);
});
.
Ma, sfortunatamente, $state.params
è sempre {}
.
Cosa sto facendo male?
Domanda bonus
Mi aspetto che FeedCtrl
venga inizializzato ogni volta che faccio clic sul link, I.e. Ogni volta che lo stato viene modificato in app.feed
.Quindi, se cambio tra lo stato app.feed
e qualche altro stato più volte, mi aspetto che il console.log
Ma sembra che l'ui-router inizializza FeedCtrl
solo una volta.Perché?
Soluzione
Per passare un parametro - dobbiamo definirlo:
.state('app.feed', {
url: "/feed/{feedId}",
views: {
'menuContent': {
templateUrl: "templates/feed.html",
controller: "FeedCtrl"
}
}
.
In questo caso lo definiamo come {feedId}
Vedi di più qui
Alcuni esempi:
- .
-
'/user/{id:[^/]*}'
- come'/user/{id}'
dall'esempio precedente. -
'/user/{id:[0-9a-fA-F]{1,8}}'
- simile all'esempio precedente, ma corrisponde solo se il parametro ID è composto da 1 a 8 cifre esadecimale. -
'/files/{path:.*}'
: corrisponde a qualsiasi URL Avvio con '/ Files /' e cattura il resto del percorso nel parametro 'percorso'. -
'/files/*path'
- Idem. Sintassi speciale per prendere tutto.
Nel caso in cui abbiamo definito il parametro, e navighiamo tra stati con diversi valori feedId
... vedremo veramente, che quel controller FeedCtrl
è reinstantiato. È così che il ui-router
è stato progettato