问题标签 [heist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Snaplet 中的静态文件
我想从 Snap 框架中的 Snaplet 提供一些静态文件。我怎么做?文档并不完全清楚。
我知道如何添加路线和东西,但我遇到了两个问题:
- 我需要传递什么
serveDirectory
来提供 snaplet 目录中的文件? - 如何在我的 snaplet 的 Heist 模板中引用这些静态文件?我显然不能使用绝对 URL,因为我不知道我的 snaplet 最终安装在最终应用程序中的 URL 前缀。换句话说,我如何在 Heist 模板中获取相对于 snaplet 根 URL 的 URL?
haskell - 在 Heist 中将接头绑定到标签
我想使用一个网站作为一个工作示例来帮助学习 Haskell。我正在尝试遵循 Snap 网站上的Heist 教程,并在网页中显示阶乘函数的结果。
我可以在编译器不抱怨的情况下获得定义为“服务器端”的示例函数,但我无法弄清楚如何将该函数绑定到一个标记,然后我可以将其放入 HTML 中。具体来说,这部分工作正常(例如,在 Site.hs 中):
但是真正重要的部分——如何评估这个函数作为网页的一部分(例如如何将它绑定到像 <fact /> 这样的标签)——是神秘的。说明说要放弃:
代码中的某处。但仅此还不够。该语句不是表达式(stuff = bindSplice...),因此不清楚如何或将其放在代码中的位置。此外,“templateState”应该来自哪里完全不清楚。似乎“templateState”应该是默认值的占位符,例如emptyTemplateState
or defaultHeistState
,但这些似乎在几年前就已被弃用,最新版本的 Heist (0.14) 无法识别它们。
MightyByte 在 2011 年曾多次评论过此类问题,但答案都掩盖了令人困惑的部分,即如何将数据实际获取到网页中。任何人都可以帮忙吗?
- 更新 -
非常感谢你,mightybyte!您的解释和对源代码的一些粗略探究消除了很多混乱,我能够从 Snap 网站教程中获得阶乘示例。这是我的解决方案 - 我是一个完整的 n00b,如果解释看起来迂腐或明显,请道歉。
我或多或少使用了 mightybyte 建议的 addConfig 方法,只是addAuthSplices
从SpliceHelpers.hs复制了实现。我通过“snap init”从默认项目开始,并addMySplices
在 Site.hs 中定义了一个函数
这使用镜头来访问 SpliceConfig 中性元素的字段mempty
,因此我必须添加Control.Lens
到 Site.hs 中的依赖项,以及Data.Monoid
放入mempty
范围。我还将阶乘拼接的类型签名更改为factSplice :: Monad n => I.Splice n
,但该函数与 Heist 教程中的形式保持不变。然后我在 Site.hsaddMySplices
旁边的应用程序初始化程序中调用addAuthSplices
这导致factSplice
被绑定到 tag <fact>
。<fact>8</fact>
正如所宣传的那样,放入默认模板之一会在页面上呈现 40320 。
大约一年前的这个问题包含一个表面上相似的解决方案,但不适用于最新版本的 Heist;不同之处在于,某些字段是通过镜头而不是直接访问的,这在 Snap 项目博客中的 Heist 0.14 公告中进行了解释。特别是,hcCompliedSplices
已经完全重新定义 - 在 Types.hs 中甚至有一个友好的警告。
haskell - 让抢劫 0.14.0.1 工作
需要明确的是,我只对使用抢劫感兴趣,而不是快照。我正在阅读 ocharles 的教程(https://ocharles.org.uk/blog/posts/2013-12-11-24-days-of-hackage-heist.html)并尝试修改他的第一个示例。这是一个简单的绑定标签。我的代码如下:
我正在使用的模板:
我得到的输出是这样的:
我看不出为什么绑定标签不起作用。实际上,我已经更新了他的代码以使用新的镜头式抢劫配置,并且我知道最近在抢劫中引入的命名空间诡计,但我看不出还有什么需要更改才能使这个示例正常工作。
haskell - 类型名称以包名称和版本为前缀
我对 Haskell 很陌生,我正在尝试跟随Happstack Crash Course。我已经完成了一些示例,但是当我尝试happstack-heist 示例时,我得到了一个奇怪的编译错误。我正在编译的文件如下所示:
错误是:
似乎有些东西想要以包名称和版本号为前缀的类型,我不明白。happstack-server 和 happstack-heist 都安装了cabal install
.
haskell - 在 Snap 中使用路由和 html (Heist)
我*.tpl
在my-snap-app/snaplets/heist/templates
( main.tpl
, page1.tpl
, page2.tpl
, ) 中有模板 ( page3.tpl
)。这是我的Main.hs
:
我怎样才能:
a) 让所有模板在我的网络应用程序中可用?意思是,我希望能够访问page1.tpl
, page2.tpl
, page3.tpl
on
localhost://page1
, localhost://page2
, localhost://page3
. 我是否必须为每个页面添加一条路线,或者我可以添加一条路线以使它们一次全部访问?
2)main.tpl
是一个主模板(布局)。如何page[123]
用 main.tpl
作主布局模板?
haskell - 抢劫不替代模板
我有以下代码,只是从这里复制粘贴和现代化(原始示例不再与最新版本的 Heist 编译)。
以及以下模板:
运行这个程序将整个模板(几乎)原样输出到控制台。不进行任何替代。现代 Hesit 版本可能需要一些函数调用。我试图在文档中追踪它,但没有运气。为什么它不起作用?
输出:
haskell - 抢劫示例不起作用:“hcCompiledSplices”不是记录选择器
我正在尝试了解如何使用 Heist,但我发现的所有示例似乎都不起作用,而且我似乎找不到与我有相同问题的其他人。我在这里找到了一些示例代码:
但是,当我尝试运行第一个示例时,出现以下错误:
我究竟做错了什么?
haskell - 在 Compiled Heist (Haskell) 中,为什么必须事先创建拼接?
我可以理解为什么必须事先处理 HTML 模板(.tpl 文件)(使用loadTemplates
)并放入HeistConfig
. 这允许 Heist 预先将 HTML 处理为更有效的格式。
但是,我不明白为什么还必须事先创建拼接并将其放入HeistConfig
. 这有什么好处?我没有看到好处,因为无论如何拼接都是在运行时计算的。这背后的思考过程是什么?
我认为这可能是因为拼接也可以在加载时(除了运行时)执行代码。这是主要的解释吗?
haskell - 将数据直接传递到已编译的 Heist (Haskell) 中的模板中?
我使用编译的抢劫。我的接头只做运行时工作(没有加载时工作)。我有一个template.tpl
这样的:
这就是我做事的方式:
- 在
/:param
路线的 Snap 动作中,我renderTemplate heistState "template"
用来获取MyHeistRuntimeMonad Builder
. - 我可以
:param
通过 ReaderT: 将值放入我的运行时 monad 来将值传递给我的拼接type MyHeistRuntimeMonad = ReaderT String IO
。(其中String
是传入的:param
值。)
这就是我的问题。将数据从我的路由传递到我的接头的唯一方法是通过 heist runtime monad。这让事情变得有点复杂。我的问题:
- 有没有其他方法可以
renderTemplate
让我直接将数据传递给模板?例如,像这样的东西:renderTemplate' "template" [("titleSplice", "myTitle"), ("bodySplice", "myBody")]
. - 如果这是不可能的,为什么不呢?我只是想知道为什么事情是这样设计的。我不太明白。
haskell - 如何在不为每个模板自动创建路线的情况下使用 Snap/Heist
是否可以以并非每个模板都有自动生成的路线的方式使用 Snap/Heist?例如,假设我有一个名为“outline”的带有<apply-content/>
标签的模板,以及一个名为“index”的模板,它调用<apply template="outline">
. 我希望“索引”模板在路线“/”下可见,而“大纲”模板没有路线。我尝试了以下方法:
调用
heistInit
并将两者都放入index.tpl
目录outline.tpl
中templates
。这会自动为“大纲”创建一条路线。放入
outline.tpl
单独的目录并调用addTemplatesAt
. 这也会自动为outline
.使用空 Config调用
/li>heistInit'
而不是heistInit
,如下所示:
做最后一种方式意味着我必须手动添加路线,这没关系。但是,即使我可以使用render
或提供模板,使用heistServeSingle
时模板也看不到对方<apply>
。
我知道这感觉只是一个“小”问题,我可以让帮助模板可见,但对我来说这感觉很草率。我很想知道http://snapframework.com是否做了一些事情来解决这个问题,但似乎他们让他们的帮助模板可见,例如:http ://snapframework.com/nav