swift - 无法在 Vapor 3 中使用 Leaf 渲染计算属性
问题描述
我一直在尝试使用带有 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())
}
解决方案
这是因为 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
}
}
推荐阅读
- ruby-on-rails - 在允许 first_name 或 last_name 为空但不能同时为空的 Rails 上进行验证
- r - 如何在 raku-lang 中连接两个矩阵?
- python - 在python中对图像数据进行欠采样
- java - 码头套接字文件描述符泄漏
- html - 提交登录按钮时,我的网页没有任何反应
- xcode - 在画布中预览简单的 swiftui 代码时,如何解决此 Xcode OptimizationLevelError 错误?
- reactjs - 如何在除 Android 和 iOS 之外的自定义操作系统上测试 React Native 组件?
- c++ - 功能用途不明,它有什么作用?
- algorithm - 任何线性函数 an + b 都是 O(n^2) CLRS
- image - 哪个程序/代码可以覆盖不同的图形元素并通过算法创建新的 image.png 文件?