离子应用程序承诺仅适用于第一视图

时间:2016-11-15 01:27:05

标签: angularjs ionic-framework

我正在构建一个简单的新闻应用。

它有两个视图。

一个是故事列表,另一个是类别列表。每个人都有一个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;
        }

    }

});

1 个答案:

答案 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;
            });

我在控制器中没有改变任何东西,现在我的承诺都归还了。我认为只有一种类型的承诺可以返回到一个视图?