2016-11-07 1 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 메서드는 internal이므로 사용할 수 없습니다. 하위 스크립트가 완료되어야한다고하는 주석이 있으며, 궁극적으로 컨텍스트에서 값을 추출하는 방법이라고 가정합니다. 그러나 그 동안에는 검색 할 수있는 방법이 있습니까?

답변

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

} 

편집 :

나는 증기의 개발자 이야기, 그리고 그들이있다 ac를 열어려고하지 마라. 컨텍스트의 내용을 공개적으로 종결하십시오. 그러나 queue: List<Node>()은 공개되었으므로 get() 기능을 자신의 내선 번호로 복사하면 원하는대로 처리 할 수 ​​있습니다.

+0

감사합니다. 태그를 사용할 때마다이 인수를 반복하지 않으려 고합니다. 그리고 이미'run' 메서드에서 컨텍스트를 가지고 있으므로 거기에서 경로를 추출 할 수 있기를 바랬습니다. – MacAvon

+0

해결 방법을 사용하여 업데이트 참조 – tobygriffin

+0

찾아 주셔서 감사합니다. 문맥을 '실행'으로 전달할 때 이상한 결정 인 것 같지만, 이유를 밝히지 않는 것이 좋습니다. 제안 된 해결 방법은 나를위한 트릭입니다. – MacAvon

관련 문제