2016-11-07 59 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