【问题标题】:Ionic HTTP Request Delayed Update离子 HTTP 请求延迟更新
【发布时间】:2017-02-09 13:25:13
【问题描述】:

我有一个基本的 ionic 应用程序,它在页面上列出作业,当单击作业时,它会调用我的 REST API 并返回从事该作业的人员。

我遇到的问题是,当点击作业时,页面加载时最初没有数据,然后如果我拉刷新页面会显示结果?

由于页面显示的人的结果应该在我拉刷新后已经没有了?

有人知道为什么我的结果在页面加载时没有显示吗?

我的工作清单

Job 1 <a href="#/job/1">Begin</a>
Job 2 <a href="#/job/2">Begin</a>
Job 3 <a href="#/job/3">Begin</a>

点击作业时,这会加载我的状态和控制器

.state('job', {
      url: '/job/:jobID',
      templateUrl: 'templates/job.html',
      controller: 'jobCtrl'
  })

控制器

.controller('jobCtrl', function($scope, $stateParams, $http, $state) {

    $scope.jobId = $stateParams.jobID;

    $scope.data = {};

    $http.get('https://domain/api/job?token=' + localStorage.getItem("token") + '&job_id=' + $scope.jobId).then(function(successResponse){

    $scope.return = successResponse;
    $scope.data = $scope.return.data.data;

    }, function(errorRepsonse){
       $scope.error = errorRepsonse;
    });

    $scope.doRefresh = function() {

    $http.get('https://domain/api/job?token=' + localStorage.getItem("token") + '&job_id=' + $scope.jobId).then(function(successResponse){

    $scope.return = successResponse;
    $scope.data = $scope.return.data.data;

    $scope.$broadcast('scroll.refreshComplete');

    }, function(errorRepsonse){
       $scope.error = errorRepsonse;
    });

  };

})

显示人员结果的视图。

<ion-refresher
  pulling-text="Pull to refresh..."
  on-refresh="doRefresh()">
</ion-refresher>

<ion-nav-back-button class="button-clear">
<i class="ion-arrow-left-c"></i> Back
</ion-nav-back-button>

<ion-list>
    <ion-item class="item-remove-animate item-icon-right" ng-repeat="person in data" type="item-text-wrap">
      <h2>{{person.name }}</h2>
  </ion-item>
</ion-list>

【问题讨论】:

    标签: php jquery angularjs ionic-framework


    【解决方案1】:

    你可以使用解决

    .state('job', {
        url: '/job/:jobID',
        templateUrl: 'templates/job.html',
        controller: 'jobCtrl',
        resolve: {
            job: function($stateParams, $http){
                return $http.get(...).then(function(resp){
                   ...
                   // return job data
                   });
            }
        }
    })
    
    ...
    

    然后在你的控制器中

    .controller('jobCtrl', function($scope, job, $http, $state) {
        $scope.job = job;
    

    您的控制器只会在 job 被解析后运行。

    此外,您可以在加载时显示加载器

    更新

    为了清楚起见:$http.get() 返回一个承诺。一旦 promise 被解决,那么你的控制器函数就会被执行。最终,$http.get 应该返回您想要在控制器中使用的数据(在本例中为作业信息)。

    这样您就不需要在控制器内开始异步获取信息。您的控制器从数据开始,应该保持简单。

    【讨论】:

    • 感谢您的回复@galchen - 我如何从解决方案中返回工作数据?我不能使用 $scope 因为它没有定义?
    • 您不需要范围。范围用于将数据连接到模板。你只需return它:return resp.data.data;
    • 所以我会“返回successResponse”?
    • 是的。您的 successResponse(在我的示例中 - resp)是服务器返回的答案。从响应中返回实际数据会更容易 - 例如:resp.dataresp.data.job(取决于您的 api)。
    • 有道理,谢谢!我刚刚做了一个快速测试。我已经在状态上实现了解析,现在返回了我的successResponse.data。在我的控制器上,我注入了作业,作为测试,我使用了 console.log(job) 但不幸的是,当页面加载时没有任何触发,我得到了设计但没有结果。我还尝试用 console.log('test') 替换 console.log(job) 并且在页面加载时,'test' 消息没有出现在我的控制台日志中。感觉好像控制器没有触发。
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2018-02-06
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多