在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
,因此我无法使用它。有一条评论说要完成下标,我认为这最终将是从上下文中提取值的方法,但与此同时,有没有办法检索它们?
答案 0 :(得分:0)
只需将当前path
作为标记的参数之一。
Droplet route:
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()
功能复制到您自己的扩展程序中,然后您就可以按照自己的意愿进行操作。