AngularJS ng-route wie man eine http-Anfrage bei der Lösung macht

Ich habe eine einfache Vorlage mit einer Eingabe und einem Ankerlink, der beim Drücken eine andere Vorlage lädt. Ich möchte, dass diese zweite Vorlage die Informationen über eine http-Anfrage abruft.

Ich verwende ng-route, um vom Pfad / search /: title zur Suchvorlage und zur Ergebnisvorlage umzuleiten, und ich versuche, die Anfrage vor dem Laden der Ergebnisvorlage mit resolv zu stellen code in plunker)

Das Hauptproblem besteht darin, dass der Controller beim Hinzufügen der Auflösung nicht mehr initialisiert wird (ich denke, er wird geladen, nachdem das Versprechen zurückgegeben wurde). Dies bedeutet, dass Variablen wie die Such-URL nicht initialisiert werden und die $ routeParams leer sind, wenn ich sie auf der Controller-Suchfunktion drucke.

Wie soll ich das machen?

Ich bin mir auch nicht sicher, ob die Syntax für die Auflösung korrekt ist. Ist die erste Suche eine Bereichsvariable?

resolve: {
    search: searchController.search 
}

Für diejenigen, die faul sind, nach Plunker zu suchen, ist hier der relevante Code:

Routing

.config(['$routeProvider',function($routeProvider) {
    $routeProvider.
      when('/search', {
        templateUrl: 'templates/search.html'
      }).
      when('/search/:title', {
        templateUrl: 'templates/result.html',
        controller: 'searchController', 
        resolve: {
            search: searchController.search
        }
      }).
      otherwise({
        redirectTo: '/search'
      });
  }]); 

searchController

var searchController = search.controller('searchController', ["$http", "$scope", "$location", '$rootScope', '$routeParams', function($http, $scope, $location, $rootScope, $routeParams) {
    console.log("Controller constructor");
    this.searchURL = 'http://www.myapifilms.com/imdb?title=%thetitle%&format=JSON';
    $scope.response = '<Response here>';
    this.title = '';
    this.defer = null;
    console.log("PARAMS: " + JSON.stringify($routeParams));
    }]);

    searchController.search = function searchMovie($q, $routeParams) {
        searchController.defer = $q.defer;

        var searchString = $routeParams.title;
        url = searchController.searchURL.replace('%thetitle%', searchString);
        console.log("URL: " + url);
        searchController.searchRequest(url);
    };

    searchController.searchRequest = function(url) {
        $http.get(url).success(function(data) {
            ....
            searchController.defer.resolve(); 
            return searchController.defer.promise;
        })
        .error(function(data, status, headers, config) {
            ...
            searchController.defer.resolve(); 
            return searchController.defer.promise;
        })
    };

Antworten auf die Frage(1)

Ihre Antwort auf die Frage