我有一个带有输入和锚链接的简单模板,按下它后,将加载另一个模板。我希望第二个模板通过 http 请求获取信息。
我默认使用 ng-route 重定向到搜索模板并从路径 /search/:title 重定向到结果模板,并且我正在尝试使用 resolve 在加载结果模板之前发出请求(plunker 中的代码)
我面临的主要问题是,当我添加解决方案时,控制器停止初始化(我猜它会在返回承诺后加载)。这意味着诸如搜索 URL 之类的变量未初始化,并且当我在控制器搜索功能上打印它们时 $routeParams 为空。
我该怎么做?
我也不确定解析的正确语法。第一次搜索是范围变量吗?
resolve: {
search: searchController.search
}
对于那些懒得检查 Plunker 的人,这里是相关代码:
路由
.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'
});
}]);
搜索控制器
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;
})
};