2014-09-05 85 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