簡體   English   中英

Vapor 3 在 Leaf 中渲染復雜調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM