【发布时间】:2016-11-16 05:55:33
【问题描述】:
我正在构建一个简单的新闻应用程序。
它有两个视图。
一个是故事列表,另一个是类别列表。每个人都有一个http.jsonp 请求。
问题是,只有第一个加载的视图的控制器会得到一个返回的承诺。例如,如果我首先加载故事列表视图(换句话说,在我的浏览器中加载页面#home),http.jsonp 请求就会正常,我会看到我的“从故事承诺中返回”警报。然后,当我单击选项卡按钮切换到类别视图时,我看到了我的 http.jsonp 请求和返回的数据,因此必须调用控制器 ang getCats(),但它不返回承诺 - 我从来没有看到“从 getCats 承诺返回”警报。如果我使用完全相同的代码,但首先在浏览器中加载类别视图,然后类别填充得很好,但是当我切换到故事视图时,它又不会返回承诺。因此,这似乎与切换到应用程序中的第二个视图有关。
如何获得第二个视图来返回承诺?
app.controller('listCtrl', ['$q','$scope','$state', 'StoriesFact',
function($q, $scope, $state, StoriesFact){
StoriesFact.getStories($scope).then(function(response){
alert("back from stories promise");
$scope.stories = response;
});
}]);
app.controller('sectionCtrl', ['$scope', 'StoriesFact',
function($scope, StoriesFact){
StoriesFact.getCats().then(function(response){
alert("back from getCats promise");
$scope.categories = response;
});
}]);
这是我的工厂,有实际的 http 调用:
angular.module('reader.StoriesFact', [])
.factory('StoriesFact', function($http, $q, $state) {
return {
getCats: function() {
var q = $q.defer();
jsonURL = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&pub=BendBulletin';
$http.jsonp(jsonURL)
.success(function(data) {
q.resolve(data.categories);
});
return q.promise;
},
getStories: function() {
var q = $q.defer();
jsonURL2 = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&cats=1829480:1829507:1829469';
$http.jsonp(jsonURL2)
.success(function(data) {
q.resolve(data.stories);
});
return q.promise;
}
}
});
【问题讨论】:
-
您可以在这种情况下使用 $ionicView.enter。 (无论是第一次加载还是缓存视图,都会触发此事件。)
-
所以,这并不是一个确切的答案,但我走了另一条路。我停止使用 jsonp,只使用了一个简单的 $http.get。这确实返回了承诺。多读一点,我发现应用程序不必处理 Cors 问题?所以我可以使用get。这是真的吗?
-
在 Ajax 调用中,您总是需要处理 Cors。 XmlHttpRequest 与 HttpRequest 不同。在前一种情况下,至少据我所知需要 cors。