2014-09-05 87 views
0

在我的HTML页面,我有一个button标签,看起来像这样:在AJAX调用之前加载HTML页面?

<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页面会加载并调用alreadyFriends函数。我试图用承诺来帮我解决这个,我发现

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

该做的工作,但HTML页面仍然在AJAX调用完成之前加载。任何想法如何解决这一问题?谢谢!

+0

一种方法是解决你的路线中的'用户'?这样,您就可以在开始时在控制器中准备好它。你有没有尝试通过'解决'而不是在控制器中进行ajax调用? – CMR 2014-09-05 08:42:18

+0

@CMR啊我明白了。我以前没有用过,也没有听说过。那么我会仔细研究一下。你能给我一些关于如何使用它的提示吗? – user1567909 2014-09-05 08:51:52

+0

看看这个例子[https://docs.angularjs.org/api/ngRoute/service/$route#example]。 – CMR 2014-09-05 08:55:43

回答

0
<button ng-hide="alreadyFreinds()" 
    ng-if="user.length > 0" 
    type="button" class="btn btn-primary btn-lg">Friend</button> 

通过设置ng-if你的按钮将是可见的,你当你的HTTP呼叫响应找回alreadyFreinds()将被解雇。

+0

这对我正在尝试做的事不起作用。我试图看看user.friends [i] ==请求&user.friends [i] ==挂起。这不是如果user.length> 0. – user1567909 2014-09-05 08:14:04

+0

,但你应该等到http回调回来,然后解雇你的函数* alreadyFreinds *,让我更新示例 – 2014-09-05 08:28:32

+0

有趣。那么我的NG - 如果继续评估是错误的,现在正在使按钮消失现在..任何想法如何防止这种情况?这很奇怪:我甚至没有用这个ng-if语句输入alreadyFreinds()函数 – user1567909 2014-09-05 08:38:24