1

在 Vapor 中,特别是在自定义 Leaf 标签的类中,您如何检索存储在上下文中的值?

我正在尝试实现一个标签,该标签采用字符串和路径,并呈现链接,除非路径是当前页面,因此,例如,#navElement("About Us", "/about")将在除关于页面本身之外的每个页面上生成指向网站关于页面的链接. 在该页面上,它应该显示没有链接的文本。

我不想每次使用时都将当前路径传递给标签,所以我将请求的路径存储在上下文中,大致如下(省略检查):

drop.get(":page"){ request in
  return try drop.view.make(thePage, ["path": request.uri.path])
}

我可以#(path)在模板中使用并查看我期望的路径。

我的自定义标签是从 派生的Tag,它的run方法接收上下文作为参数,我可以在调试器中看到存储的值——但我该如何获得呢?类中的get方法Context,似乎是这样做的internal,所以我不能使用它。有一条评论说要完成下标,我认为这最终将是从上下文中提取值的方式,但与此同时,有没有办法检索它们?

4

1 回答 1

0

只需将当前path参数之一设置为您的标签。

飞沫路线:

drop.get(":page") { request in
  return try drop.view.make(thePage, ["currentPath": request.uri.path])
}

在模板中:

#navElement("About Us", "/about", currentPath)

标签:

class NavElement: Tag {

  let name = "navElement"

  public func run(stem: Stem, context: LeafContext, tagTemplate: TagTemplate, arguments: [Argument]) throws -> Node? {
    guard
      let linkText = arguments[0].value?.string,
      let linkPath = arguments[1].value?.string,
      let currentPath = arguments[2].value?.string
    else { return nil }
    if linkPath == currentPath {
      return Node("We are at \(currentPath)")
    } else {
      return Node("Link \(linkText) to \(linkPath)")
    }
  }

}

编辑:

我已经和 Vapor 的开发者谈过了,他们不打算公开访问 Context 的内容。但是,由于queue: List<Node>()是公开的,您只需将该get()功能复制到您自己的扩展程序中,然后您就可以按照您的意愿进行操作。

于 2016-11-07T21:09:02.313 回答