如何在Eliom </button>中复制<button>

时间:2014-12-25 20:57:25

标签: button ocaml ocsigen

我正在尝试在Eliom中复制以下代码,但我无法找出复制<button>标记的最佳方法。 Eliom文档只让我更加困惑。似乎使用string_button可能是最好的方法,但我不明白我为name参数提供的内容。

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Button Styles</h2>
  <button type="button" class="btn btn-default">Default</button>
  <button type="button" class="btn btn-primary">Primary</button>
  <button type="button" class="btn btn-success">Success</button>
  <button type="button" class="btn btn-info">Info</button>
  <button type="button" class="btn btn-warning">Warning</button>
  <button type="button" class="btn btn-danger">Danger</button>
  <button type="button" class="btn btn-link">Link</button>      
</div>

</body>
</html>

string_button:

val string_button : 
  ?a:HTML5_types.button_attrib Eliom_pervasives.HTML5.M.attrib list ->
  name:[< string Eliom_parameters.setone ] Eliom_parameters.param_name ->
  value:string ->
  HTML5_types.button_content Eliom_pervasives.HTML5.M.elt list ->
  [> HTML5_types.button ] Eliom_pervasives.HTML5.M.elt

string_button doc: http://ocsigen.org/eliom/2.0/api/client/Eliom_output.Html5#VALstring_button

编辑: 我认为Eliom文档中的类型签名

name:[< string Eliom_parameters.setone ] Eliom_parameters.param_name

type +'a param_name

type 'a setone = [ `One of 'a | `Set of 'a ]

意味着我会使用像

这样的东西
~name:(`One "name_goes_here")

具有类型签名

[> `One of string ]

这会让我相信我需要使用

~name:(`One "name_goes_here") param_name

获得

的签名
[< string Eliom_parameters.setone ] Eliom_parameters.param_name

但它只会产生以下错误:

Error: Parse error: currified constructor

我做错了什么?

1 个答案:

答案 0 :(得分:1)

该参数的类型乍一看确实看起来有点令人困惑,但通过查看该类型的每个元素,它实际上是可以理解的:

Eliom_parameters.param_name

来自Eliom文档:

  

输入'a param_name

     

参数名称的抽象类型。 'a类型参数是幻像类型,通常是Eliom_parameters.setoneradio的子类型,用于表示参数的arity。

这里,幻像类型意味着类型参数实际上并没有出现在类型定义中,而只是作为一种方式来帮助类型检查器进一步区分值而不仅仅是它们原来的“未修饰类型”(我在这里的意思)是没有幻像参数类型的类型)。换句话说,无论'a可能是什么,它都不会改变你的函数所期望的实际值,但是一旦键入它,它可能会限制哪个其他函数可以操纵该值。

也就是说,类型itelf是一个抽象类型,这意味着我们不能直接构造该类型的值,我们必须依赖框架中包含的函数来为我们提供它们。

如果我们看看如何在 eliom 中构建服务,我们会注意到使用占位符为这种值构建表单,并使用为每个值运行参数的函数进行包装。这让我们构建可重用且有意义的html片段,例如具有强类型参数的表单

documentation证实了这一见解:

  

Eliom重新定义了大多数表单元素(输入,textareas,复选框等),以便检查表单的类型 w.r.t. 服务类型

在您的情况下,元素尚未嵌入表单中,因此您最好的选择可能是使用所谓的原始元素。大多数(如果不是全部)它们与常规窗体小部件位于相同的模块中;您希望使用的名为raw_button,并为stringname参数提供value个参数。