【问题标题】:Cannot render a computed property with Leaf in Vapor 3无法在 Vapor 3 中使用 Leaf 渲染计算属性
【发布时间】:2019-05-06 22:51:09
【问题描述】:

我一直在尝试使用带有 Vapor 3 的模板引擎 Leaf 来渲染计算属性,但到目前为止还没有运气。如果存储相同的属性,则一切正常。如果我对其进行计算,则网页中不会显示任何内容。我可以理解这种解决方案不起作用的原因,但我想知道是否有任何方法可以使它起作用。

要呈现的元素的代码

struct SocialLinkContext: Encodable, CSSStyleable {
    let hyperlinkURI: String
    let classes: [String]
    //let styleClasses: String

    init(hyperlinkURI: String, classes: [String]) {
        self.hyperlinkURI = hyperlinkURI
        self.classes = classes
        //self.styleClasses = classes.joined(separator: " ")
    }

    //Seems not to be supported by Leaf
    var styleClasses: String {
        return self.classes.joined(separator: " ")
    }
}

main_page.leaf 文件的一部分:

...
<div class="row banner">
    <div class="banner-text">
        <h1 class="responsive-headline">Hello, world!</h1>
        <hr />
    </div>
    #embed("social_links")
</div>
...

social_links.leaf 文件:

<ul class="social">
    #for(socialContext in socialLinks) {
        <li>
            <a href="#(socialContext.hyperlinkURI)">
                <i class="#(socialContext.styleClasses)"></i>
            </a>
        </li>
    }
</ul>

要传递给 View Renderer 的 PersonalPageContext

struct PersonalWebPageContext: Encodable {
    ...
    let socialLinks: [SocialLinkContext] = [...]
    ...
}

最后,PersonalWebPageViewController 控制器:

private func serveWebPage(req: Request) throws -> Future<View> {
    return try req.view().render("main_page", PersonalWebPageContext())
}

【问题讨论】:

    标签: swift vapor leaf


    【解决方案1】:

    这是因为 Leaf 使用 Codable 将您的上下文类型转换为 Leaf 可以使用的数据。现在默认情况下,Codable编码或解码计算属性。如果你想这样做,你必须手动实现encode(to:) 方法。

    struct SocialLinkContext: Encodable, CSSStyleable {
        let hyperlinkURI: String
        let classes: [String]
    
        var styleClasses: String {
            return self.classes.joined(separator: " ")
        }
    
        init(hyperlinkURI: String, classes: [String]) {
            self.hyperlinkURI = hyperlinkURI
            self.classes = classes
        }
    
        func encode(to encoder: Encoder)throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encode(self.hyperlinkURI, forKey: .hyperlinkURI)
            try container.encode(self.classes, forKey: .classes)
            try container.encode(self.styleClasses, forKey: .styleClasses)
        }
    
        enum CodingKeys: String, CodingKey {
            case hyperlinkURI, classes, styleClasses
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2021-10-04
      • 2019-12-04
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多