【问题标题】:ionic app promise only works in first view离子应用承诺仅在第一视图中有效
【发布时间】: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。

标签: angularjs ionic-framework


【解决方案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;
            });

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 2021-03-13
    • 2019-11-16
    • 2020-02-10
    • 2018-06-20
    • 2019-06-22
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多