[英]Vapor 3 rendering complex call in Leaf
這是適用於我的 API 的調用,但我需要在葉中呈現結果。 這目前適用於 API。 只是不確定我在哪里抓住團隊。
func getTeamsWithUsersForEvent(_ req: Request) throws -> Future<[TeamWithUsers]> {
let currentID = try req.parameters.next(Int.self)
print("currentID \(currentID)")
return Team.query(on: req).filter(\Team.eventID == currentID).sort(\Team.rawScore, .descending).range(..<5).all().flatMap(to: [TeamWithUsers].self) { team in
try team.map { team in
try team.users.query(on: req).all().map { users in
var score: Int
if users.isEmpty {
score = 0
}else{
score = team.rawScore / users.count
}
return TeamWithUsers(
id: team.id,
name: team.name,
icon: team.icon,
eventID: team.eventID,
rawScore: team.rawScore,
//users: users,
count: users.count,
teamScore: score
// teamScore: team.rawScore / users.count
)
}
}.flatten(on: req)
}
}
struct TeamWithUsers: Content {
let id: Int?
let name: String
let icon: String
let eventID: Event.ID
let rawScore: Int
//let users: [User]
let count: Int?
let teamScore: Int
}
這是我開始的。 這是我的上下文。
struct AllTeamsContext: Encodable {
let title: String
let teams: [TeamWithUsers]
}
我創建了名為“Leaders”的 Leaf 模板,它只顯示一個每行包含 TeamWithUsers 的表格。
#if(count(teams) > 0) {
<table class="table table-bordered table-hover">
<thead class="thead-light">
<tr>
<th>Name</th>
<th>Icon</th>
<th>Score</th>
</tr>
</thead>
<tbody>
#for(team in teams) {
<tr>
<td>#(team.name)</td>
<td>#(team.icon)</td>
<td>#(team.teamScore)</td>
</tr>
}
</tbody>
</table>
} else {
<h2>There aren’t any teams yet.</h2>
}
編輯:根據評論中的附加信息更改了答案。
雖然您可以更改現有函數以直接返回視圖,但我個人會保持原樣並從呈現視圖的一秒鍾內調用它。 嘗試將其與當前功能放在同一路由器中:
func teamsView(_ req: Request) throws -> Future<View> {
let currentID = try req.parameters.next(Int.self)
let teamsContext = getTeamsWithUsersForEvent(request, currentID)
return request.view().render("Leaders", teamsContext )
}
然后,在您的routes.swift
或等效文件中,輸入:
router.grouped("admin","teams") teamsRoute.get("leaders", Int.parameter, use: teamsView)
將參數移動到上面的tsamsview
函數中,然后您需要將原始函數頭修改為:
func getTeamsWithUsersForEvent(_ req: Request, _ currentID:Int) throws -> Future<[TeamWithUsers]>
然后從此函數中刪除原始參數提取。
當您的路由器分組時,您的視圖應該在以下位置可見:
http://localhost:8080/admin/teams/nnn/leaders
其中nnn
是將被轉換為currentID
。
或者:
如果這有點混亂(盡管我第一次評論希望將函數分開),您始終可以將現有函數更改為:
func getTeamsWithUsersForEvent(_ req: Request) throws -> Future<View> {
let currentID = try req.parameters.next(Int.self)
print("currentID \(currentID)")
let teamContext = Team.query(on: req).filter(\Team.eventID == currentID).sort(\Team.rawScore, .descending).range(..<5).all().flatMap(to: [TeamWithUsers].self) { team in
try team.map { team in
try team.users.query(on: req).all().map { users in
var score: Int
if users.isEmpty {
score = 0
} else {
score = team.rawScore / users.count
}
return TeamWithUsers(
id: team.id,
name: team.name,
icon: team.icon,
eventID: team.eventID,
rawScore: team.rawScore,
//users: users,
count: users.count,
teamScore: score
)
}
}.flatten(on: req)
}
return request.view().render("Leaders", teamContext )
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.