2016-11-07 35 views
1

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

我试图实现一个标记,它需要一个字符串和一个路径,并呈现一个链接,除非路径是当前页面,因此,例如,#navElement("About Us", "/about")将在每个页面上产生一个链接到该网站的关于页面除了关于页面本身。在该页面上,它应该显示没有链接的文本。

我不想在每次我用它时的电流路径传递到标签,所以我存储请求的路径的背景下,大致是这样的(略检查):

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

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

我的自定义标记来源于Tag,它的run方法接收上下文作为参数,并且我可以在调试器中看到存储的值 - 但是如何获取它? Context类中的get方法似乎是这样做的,因此我无法使用它。有一条评论指出要完成下标,并且我认为这最终将成为从上下文中提取数值的方式,但同时,还有什么方法可以检索它们吗?

回答

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)") 
    } 
    } 

} 

编辑:

我曾与蒸汽的开发商,他们不打算开辟交流公开地接受上下文的内容。但是,由于queue: List<Node>()是公开的,因此您可以将get()函数复制到您自己的扩展中,然后就可以按照您的要求进行操作。

+0

谢谢,但我试图避免每次使用标签时重复该说法,并且由于我已经在'run'方法中使用了上下文,所以我希望能够从那里提取路径。 – MacAvon

+0

请参阅更新与解决方法 – tobygriffin

+0

感谢您发现此问题。看起来像一个奇怪的决定,当他们将上下文传递给'run'时,但我不明白为什么。建议的解决方法为我做了诀窍。 – MacAvon