Pergunta

Considere a seguinte configuração do roteador ui:

$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"
      }
    }
  })

Tenho o seguinte link no meu aplicativo:

<a ui-sref="app.feed({ feedId: 5 })">My Link</a>

Estou tentando conseguir o feedId em parâmetros de estado:

angular.module('MyApp').controller('FeedCtrl', function($state) {
  console.log($state.params);
});

Mas infelizmente, $state.params é sempre {}.

O que estou fazendo de errado?

PERGUNTA BÔNUS

eu espero FeedCtrl para ser inicializado toda vez que eu clicar no link, ou seja,toda vez que o estado é alterado para app.feed.Então, se eu mudar entre app.feed estado e algum outro estado várias vezes, espero que o console.log acima para ser executado várias vezes.Mas parece que o ui-router inicializa FeedCtrl apenas uma vez.Por que?

Foi útil?

Solução

Para passar um parâmetro - temos que defini-lo:

 .state('app.feed', {
    url: "/feed/{feedId}",
    views: {
      'menuContent': {
        templateUrl: "templates/feed.html",
        controller: "FeedCtrl"
      }
    }

Neste caso definimos como {feedId}

Veja mais aqui

Alguns exemplos:

  • '/user/{id:[^/]*}' - Igual a '/user/{id}' do exemplo anterior.
  • '/user/{id:[0-9a-fA-F]{1,8}}' - Semelhante ao exemplo anterior, mas corresponde apenas se o parâmetro id consistir de 1 a 8 dígitos hexadecimais.
  • '/files/{path:.*}' - Corresponde a qualquer URL começando com '/files/' e captura o resto do caminho no parâmetro 'path'.
  • '/files/*path' - Idem.Sintaxe especial para pegar tudo.

Caso tenhamos parâmetros definidos, navegaremos entre estados com diferentes feedId valores...realmente veremos que esse controlador FeedCtrl é reinstaurado.É assim que o ui-router foi designado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top