L'appel d'une angularjs ui-router état de l'intérieur d'un contrôleur

- Je utiliser le angularjs ui-router pour établir les divers états au sein d'une application. Alors que je sais que je peux aller à l'état à partir d'un lien dans le html (via ui-sref), est-il possible de passer de l'état de l'intérieur d'un contrôleur?

Les extraits de code ci-dessous sont une simple application angularjs pour aider à illustrer mon point.

Dans l'exemple ci-dessous, j'ai deux états:

  1. Il est dans un état appelé home que c'est un simple formulaire contenant un champ de saisie de texte et un bouton qui appelle une fonction de recherche dans le contrôleur.
  2. Il est dans un état appelé search qui prend un paramètre de requête appelé texte. Son contrôleur appelle un service qui effectue une recherche basée sur le texte. Les résultats sont affichés à la page.

Premier est le module d'initiation.

var app = angular.module('example', [
    'ui.router'
  ]);

Ci-dessous la configuration de l'interface utilisateur-les états de routage comme expliqué précédemment.

app.config(
  function($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise('/');
    $stateProvider.
      state('home', {
        url: '/',
        template: '<input ng-model="text" type="text" placeholder="Query Text">' +
          '<button type="button" ng-click="search()">Search</button>',
        controller: 'SearchFormController'
      }).
      state('search', {
        url: '/search?text',
        template: '<pre>{{results | json}}</pre>',
        controller: 'SearchController'
      });
  });

La SearchFormController contrôles du formulaire de saisie de recherche. Ce contrôleur transfère simplement le formulaire d'entrée pour le search état. Est-il possible de référencer le de recherche état par opposition à la construction d'une URL et d'appel $lieu.chemin?

app.controller('SearchFormController', 
  function($scope, $location) {
    $scope.text = '';
    $scope.search = function() {
      //Can I use the 'search' state here instead of 
      //constructing a url and calling $location.path?
      $location.path('/search?text='+ encodeURIComponent($scope.text));
    };
  });

Le contrôleur de la recherche, SearchController, ressemblerait à quelque chose comme ci-dessous. Ce serait prendre le stateParams (c'est à dire, les paramètres de la requête) à émettre un $http appel.

app.controller('SearchController',
  function($scope, $stateParams, $http) {
    $scope.results = [];
    asUrl = function(resourceUrl, queryParams) {
      //do stuff and return http url
    };
    $http.get(asUrl("/someServiceUrl/search", $stateParams))
      .success(function(data, status) {
        $scope.results = data;
      })
      .error(function(data, status) {
        //display an error message
      });
  });

Encore, dans la SearchFormController, est-il possible de référencer le de recherche état de la config par son nom? Par exemple, dans une page html, je pourrais avoir un lien comme ceci: <a ui-sref="search({text:Foo})">Search where text=Foo</a> où la search état est référencé par son nom et passe dans les paramètres. Quelque chose de semblable, être invoqué à partir d'un contrôleur (par son nom, en lui passant en paramètres)?

OriginalL'auteur whyceewhite | 2015-01-25