【问题标题】:HTML Page loads before AJAX call?在 AJAX 调用之前加载 HTML 页面?
【发布时间】:2014-10-30 03:07:52
【问题描述】:

在我的 HTML 页面中,我有一个 button 标记,如下所示:

<button ng-hide="alreadyFreinds()" type="button" class="btn btn-primary btn-lg">Friend</button>

但是,当我尝试访问下面显示的 alreadyFriends 函数的某些部分时,我收到一条错误消息,指出 TypeError: Cannot read property 'length' of undefined

  $scope.alreadyFreinds = function(){
    for(var i = 0; i < $scope.user.friends.length; i++){
      if($scope.user.friends[i].username === $scope.realUserViewing.username && 
        $scope.user.friends[i].requested == true && $scope.user.friends[i].pending == true){
        return true;
      }
    }
  };

但是,令人困惑的是,我已经在这个函数上方的几行中定义了 $scope.user.friends 和 $scope.user,如下所示:

  $http.get('/api/users/me')
    .then(function(result){
      $scope.user = result.data;
  });

对于为什么在 Ajax 调用完成之前加载 HTML 页面并调用 tbe alreadyFriends 函数,我有点困惑。我尝试使用 Promise 来帮助我解决这个问题,我发现

AngularJS: How to execute a controller function AFTER completion of AJAX call in a service?

但这对我没有太大帮助,因为当我这样做时

  $http.get('/api/users/me')
    .then(function(result){
      var deferred = $q.defer();
      $scope.user = result.data;
      deferred.resolve($scope.alreadyFreinds);
      return deferred.promise;
  });

这确实有效,但在 AJAX 调用完成之前 HTML 页面仍会加载。任何想法如何解决这一问题?谢谢!

【问题讨论】:

  • 一种方法是解决您路线中的“用户”?这样,您将一开始就在控制器中准备好它。您是否尝试过通过“解决”而不是在控制器中进行 ajax 调用?
  • @CMR 啊,我明白了。我以前没用过,也没听说过。到时候我会研究一下。你能给我一些关于如何使用它的提示吗?
  • 你把 $scope 添加到你的控制器了吗?

标签: javascript html ajax angularjs


【解决方案1】:
    <button ng-hide="alreadyFreinds()" 
     ng-if="user.length > 0"
     type="button" class="btn btn-primary btn-lg">Friend</button>

通过设置ng-if,您的按钮将可见,并且当您的http 调用响应返回时,您的alreadyFreinds() 将被触发。

【讨论】:

  • 这对我想做的事情不起作用。我正在尝试查看 user.friends[i] == requested & user.friends[i] == pending。如果 user.length > 0,则不是。
  • 但您应该等到 http 回调返回然后触发您的函数 alreadyFreinds,让我更新示例
  • 有趣。好吧,我的 ng-if 一直评估为假,这现在正在使按钮消失。关于如何防止这种情况的任何想法?很奇怪:我什至没有使用这个 ng-if 语句输入 alreadyFreinds() 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多