haskell - Yesod 将 getCurrentRoute 与具有动态参数的路由进行比较
问题描述
以良好的形式编码 haskell 的问题,而不是“它有效”。
当用户在该页面上时,我们希望我们的菜单导航项具有突出显示的 CSS 类。
简单的。
这是我的路线:
...
/simple SimpleR GET POST
/search SearchFormR GET POST
/searchresults/#Int/#Text SearchResultsR GET
...
在我的小村庄模板中,我有以下内容。这非常有效,当用户在该页面上时,链接会突出显示。路线很简单。
<li .nav-item>
<a .nav-link :Just SimpleR == mcurrentRoute:.active href=@{SimpleR}>
Simple page
SearchFormR
当用户在或中时,应突出显示此链接SearchResultsR
。
<li .nav-item>
<a .nav-link :((Just (SearchResultsR _ _)) == mcurrentRoute) || (Just SearchFormR == mcurrentRoute):.active href=@{SearchFormR}>
Search
这段代码不起作用,因为SearchResultsR
路由构造函数需要传递给它的两件事。我不能_ _
像上面那样写,因为构造函数需要一个文字值。此外,构造函数的结果==
无论如何都会与实际路由进行比较,除非两个参数恰好完全相同,否则它不会匹配。
没有_ _
我当然会得到一个类型错误,期待另外两件事传递给SearchResultsR
构造函数。
也就是说,我想检查我们是否在任何SearchResultsR
路线上,而不仅仅是 match SearchResultsR 123 "abc"
。
我的第一个想法是创建一个函数将路由转换为字符串,然后检查该字符串是否包含路由的字符串,但这很糟糕,而不是 haskell / typesafe 方式。
我的第二次尝试是使用模式匹配:
基金会.hs:
isThisRouteSearchResultsR :: Maybe (Route App) -> Bool
isThisRouteSearchResultsR (Just (SearchResultsR _ _)) = True
isThisRouteSearchResultsR _ = False
哈姆雷特模板:
<li .nav-item>
<a .nav-link :(isThisRouteSearchResultsR mcurrentRoute) || (Just SearchR == mcurrentRoute) :.active href=@{SearchR}>
Search
但这似乎也好不到哪里去。如果我有更多包含动态部分的路线怎么办?这样做的正确方法是什么?我查看了 haskellers 网站源代码,但找不到答案
解决方案
Sibi 在评论中给出的答案(谢谢 Sibi)是问题中的第二种方法的形式/风格很好。
例如在小村庄:
:(isThisRouteSearchResultsROrSearchR mcurrentRoute) :.active
或者可以做
:(isThisRouteSearchResultsR mcurrentRoute) || (isThisRouteSearchR mcurrentRoute) :.active
您根据问题代码在 Foundation.hs (Haskell) 中定义这些函数。
思比:
目标是通常将所有逻辑保留在 Haskell 文件中,并在 Hamlet 文件中保持最小化。
谢谢思比的指导。
推荐阅读
- r - 速度-加速度热图
- vb.net - 点网文本框中的 FarPoint 文本框更改事件的替代方法是什么
- c# - 从 MVC 中的 IEnumerable 列表中删除无效的手机号码
- asynchronous - 使用 Electron+Vue 和 nodeffi 的异步回调
- regex - 正则表达式拆分文件名vba
- excel - 从包含函数/公式的单元格中获取单元格值
- mongodb - Mongo db query 用于连接查询
- windows - 从 shell 脚本推送到 git Windows 共享
- python - 将元组列表转换为python中的列表列表
- validation - Angular 6 - 删除 ngClass