我正在构建一个简单的新闻应用。
它有两个视图。
一个是故事列表,另一个是类别列表。每个人都有一个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;
}
}
});
答案 0 :(得分:1)
我改变了一个工厂函数 - getStories到一个普通的http.get现在似乎工作了。我摆脱了我自己的任何承诺代码 - $ q库,并且只使用了http请求为getCats调用返回的承诺。我不得不改变工厂,不同地调用它。
return {
getCats: function() {
jsonURL = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&pub=BendBulletin';
return $http.jsonp(jsonURL).then(function(response){
return response.data;
});
},
getStories: function() {
jsonURL = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&pub=BendBulletin';
return $http.get(jsonURL).then(function(response){
appCats = response.data;
return response.data;
});
我在控制器中没有改变任何东西,现在我的承诺都归还了。我认为只有一种类型的承诺可以返回到一个视图?