AngularJS ng路由如何在解析时发出http请求
AngularJS ng-route how to make http request on resolve
我有一个简单的模板,它有一个输入和一个锚链接,按下它后,将加载另一个模板。我希望第二个模板通过http请求获取信息。
默认情况下,我使用ng路由重定向到搜索模板,并从路径/search/:title重定向到结果模板,我正在尝试使用resolve在加载结果模板(plunker中的代码)之前提出请求
我面临的主要问题是,当我添加resolve时,控制器停止初始化(我想它将在promise返回后加载)。这意味着当我在控制器搜索函数上打印诸如搜索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'
});
}]);
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;
})
};
我认为您应该使用.factory创建一个服务,并相应地进行编辑:
angular.module('myApp', ['ionic', 'ngRoute', 'starter', 'wc.Directives'])
.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if (window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if (window.StatusBar) {
StatusBar.styleDefault();
}
})
})
.factory("search", function($q, $http){
return {
getMessage: function(){
//return $q.when("Response");
var promise = $http({ method: 'GET', url: 'your_url'}).success(function(data, status, headers, config) {
return data;
});
return promise;
}
};
})
.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/search', {
templateUrl: 'search.html'
}).
when('/search/:title', {
templateUrl: 'result.html',
controller: 'searchController',
/*resolve: {
search: searchController.search
}*/
resolve: {
search: function(search){
return search.getMessage();
}
}
}).
otherwise({
redirectTo: '/search'
});
}
]);
你的plunker分叉:http://plnkr.co/edit/Ry4LAl?p=preview
我希望你得到了你想要的,在你完成了帮助他人的任务后,把你的钱还给别人。
相关文章:
- Meteor如何接收HTTP请求
- 在我的情况下,如何进行http请求
- 使用插件收听Firefox标签的http请求
- http请求使用html而不是json进行响应
- 在node-js路由中发出http请求
- 是否可以在没有HTTP请求或<输入>
- Acync JS HTTP请求通知请求
- PhantomJs在控制台中发出http请求时不会返回任何状态
- PHP处理来自一个页面的http请求,并将其显示在另一个页面上
- Firefox插件-如何发出http请求
- 验收测试主要针对传出的http请求
- 验证HTTP请求来自NFC标签上的点击
- 如何制作'http请求'在Node js中同步
- 为什么我在Cloud9中的http请求总是返回错误
- AngularJS Typeahead和$http请求限制
- HTTP请求使用cURL,但在浏览器中使用javascript时会得到CORS响应
- 如何使用Chrome扩展API获取网页的所有HTTP请求
- 将http请求中的数据传递给C#控制器
- 在初始化路由之前发送$http请求
- 从客户端捕获 HTTP 请求(包括 ajax)