2016-08-14 72 views
0

我確信這個問題以前已經問過了,但是我看不到或找不到最好的解釋,因此我想重新提出同樣的問題並用一些例子打開線索以獲得更清晰的答案。如何在Angular中調用ng-repeat中的另一個函數

我的目標是顯示團隊及其排名,注意:爲顯示排名,我有一個單獨的函數,根據他們在db中的分數字段得到團隊的排名。

我有一個TeamController如下內的兩個功能:

 tm.showAllByClass = function (classId) { 
      TeamService.showAllByClass(classId).then(function (response) { 
       tm.teamsInClass = response.data; 
      }).catch(function (error) { 
       $scope.result = error; 
      }); 
     }; 

     tm.ranking = function (classId, teamId) { 
      TeamService.ranking(classId, teamId).then(function (response) { 
       return response.data; 
      }).catch(function (error) { 
       $scope.result = error; 
      }); 
     }; 

     <tr ng-repeat="tm in team.teamsInClass.data"> 
       <td>{{tm.group_number}}</td> 
       <td>{{tm.role.name}}</td> 
       <td>{{tm.ranking(tm.class_id, tm.id)}}</td> 
       <td>{{tm.amount | currency}}</td> 
     </tr> 

而且這是在後端部分功能得到所有團隊:

public function findAllTeamsInClass($classId) 
{ 
    return Team::where('class_id', '=', $classId)->with('role', 'business')->get(); 
} 

// return rank of team 
public function teamRanking($classId, $teamId){ 
    return 3; // for sake of simplicity I just return a static value 
} 

有什麼辦法,我可以附上teamRanking功能直接把團隊實體當作關係或者什麼的?

出於某種原因,tm.ranking()沒有返回任何東西,我怎樣才能調用返回ng-repeat內的值的函數。

+0

當然,在'ngRepeat'裏面做一個'$ http' * request *是一個不好的習慣。另外我懷疑你沒有收到像'無限摘要'或類似的錯誤.. – developer033

+0

@ developer033,我完全同意你的觀點,我沒有選擇這樣做,你能告訴我什麼是另一種方式嗎?或者如何處理這種情況的最佳方式? – artan

+0

我非常感謝你對此的幫助,因爲這對我理解如何處理這個問題非常重要。如果你可以用一些例子來解釋它,情況會更好。 – artan

回答

0

由於個別排名的提取是異步的,因此這些操作需要從團隊列表的提取中鏈接鏈接

team.showAllByClass = function (classId) { 
    TeamService.showAllByClass(classId).then(function (response) { 
     team.teamsInClass = response.data; 
     //return for chaining 
     return team.teamsInClass; 
    }).then(function(teamsInClass) { 
     promiseArray = []; 
     for (var iTeam=0; iTeam<teamsInClass.length; iTeam++) { 
      //IIFE 
      (function (iTeam) { 
       var iPromise = TeamService.ranking(classId, iTeam.id); 
       iPromise = iPromise.then(function(response) { 
        var ranking = response.data; 
        team.teamsInClass[iTeam].ranking = ranking; 
        return ranking; 
       }); 
       promiseArray.push(iPromise); 
      })(iTeam); 
      //end IIFE 
     }; 
     //return for chaining 
     return $q.all(promiseArray); 
    }).then(function(rankingArray) { 
     console.log("All rankings fetched");   
    }).catch(function (error) { 
     $scope.result = error; 
    }); 
}; 

上面的例子取出強隊之列,然後創建一個附加的每個等級給每個團隊的承諾清單。它使用$q.all承諾列表。

的HTML

<tr ng-repeat="tm in team.teamsInClass"> 
      <td>{{tm.group_number}}</td> 
      <td>{{tm.role.name}}</td> 
      <td>{{tm.ranking || 'PENDING' }}</td> 
      <td>{{tm.amount | currency}}</td> 
    </tr> 

排名將顯示爲PENDING直到數據被從API檢索。

+0

我做了同樣的事情,只是從後端完成它...我會接受這是正確的asnwer :) – artan

0

你可能有此相同的答案: https://stackoverflow.com/a/26400951/6715875

,你可以簡單地調用內部NG重複相同的功能正常的一個。

+0

這不適合我! – artan

+0

我曾嘗試過,Everythings都行。 你能告訴我案件不能用嗎? –

相關問題