Formlet是最近一套来自学术界的形式体系,它是WebSharper不可分割的一部分。而WebSharper则是最初实现Formlet的几个框架之一。Formlet代表了一流的、类型安全的、可组合的数据表单,它与你可能一直在用的ASP.NET或其他Web框架中的非严格类型的方法有着很大的不同。WebSharper实现中包含了从属formlet,其中formlet的一部分从属于另一部分,例如从属于多选项的下拉框或是输入框中的输入值;flowlets是一种定制的布局,它用来在一个formlet计算表达式或F#一元结构中以一种类似向导的顺序方式一步步渲染每一个formlet.
下面是一个简单的formlet,它返回一个字符串值,其中各种不同的增强被增量式应用于其上http://www.wx-jr.com
let nameF =
Controls.Input “”
|> Validator.IsNotEmpty “Empty name not allowed”
|> Enhance.WithValidationIcon
|> Enhance.WithTextLabel “Name”
Formlet可以被映射到任意类型的返回值上,例如一个百分比输入控件可能会返回0到100之间的浮点数值,或者一个组合框可能会生成可区分联合(discriminated union)中的某种类型(可能有也可能没有标记值)。你可以用许多方式将多个较小的formelet组合成更大的formlet.最简单的方法是使用Formlet.Yield函数将任意类型的值封装成该类型的formlet,并结合<*>操作符组合两个(或通过连续调用组合多个)formlet:
Formlet.Yield (fun v1 v2 … vn -> <compose all v's>)
<*> formlet1
<*> formlet2
…
<*> formletn
下面的例子展示了Formlet如何获取个人信息(姓名和邮件),并进行基本的客户端验证http://www.sd-ju.com
type Person = {
Name: string
Email: string
}
[<JavaScript>]
let PersonFormlet () : Formlet<Person> =
let nameF =
Controls.Input “”
|> Validator.IsNotEmpty “Empty name not allowed”
|> Enhance.WithValidationIcon
|> Enhance.WithTextLabel “Name”
let emailF =
Controls.Input “”
|> Validator.IsEmail “Please enter valid email address”
|> Enhance.WithValidationIcon
|> Enhance.WithTextLabel “Email”
Formlet.Yield (fun name email -> { Name = name; Email = email })
<*> nameF
<*> emailF
|> Enhance.WithSubmitAndResetButtons
|> Enhance.WithLegend “Add a New Person”
|> Enhance.WithFormContainer
图2显示了嵌入在sitelet页面后的结果。注意页面样式是由从属的CSS资源提供的,它会在引用formlet代码时自动加载到页面中(事实上,准确地说是发生在调用Enhance.WithFormContainer时)。WebSharper中高级的依赖性跟踪功能会在页面处于服务状态时为其自动收集所依赖的资源。这个功能非常便利,它为使用各种不同的WebSharper扩展和使用第三方的JavaScript库节省了大量的时间和精力,并且它从根本上消除了手工跟踪页面所需资源的需要http://www.wx-jr.com
上面formlet例子中的[<JavaScript>]标注指示WebSharper将代码段翻译为JavaScript.每个控件中增强的验证器均为WebSharper formlet库的一部分,并且它们提供客户端验证,因此Validator.IsEmail将确保在formlet在到达一种可接受状态前只键入了合法的邮件地址。你还可以调用自定义的函数或者通过进一步加强手头的formlet来提供额外的验证。如果某个函数被标记为[<Rpc>]并从客户端代码中调用,那么WebSharper将会生成代码执行RPC(远程过程调用)并自动处理客户端和服务端的值传递。你可以无缝使用任意复杂的F#对象,如嵌套列表(nested list)、映射(map)、集合(set)或序列(sequence),而不用担心它们在内部被如何映射。这统一了客户端和服务端代码,并且大大地减少了开发时间。事实上,客户端和服务端代码在开发过程中通常位于同一个F#文件中,只是它们被组织进同一命名空间下的不同模块中http://www.wx-jr.com
许多WebSharper模式可以用来开发客户端-服务器应用程序,我们通常建议使用sitelet和formlet一起工作,并提供各种编码指导来最大限度地提高开发人员的工作效率,但是你也可以借助WebSharper在大量的ASP.NET代码基础上开发混合型的应用程序,或者基于WebSharper的功能改善现有的ASP.NET应用程序http://www.sd-ju.com
从抽象中构建来满足所需
有时,你可能需要跳出标准WebSharper formlet库的范围来为应用程序实现表单(或者整个UI)。例如,你可能想要使用不同的输入控件来渲染formlet,因为简单的CSS重写可能不能够满足你所想要的外观和感觉。其它时候,你想重用现有的JavaScript控件库,如Ext JS,YUI,或是jQuery UI来得到更精细的外观和感觉。WebSharper为上述的第三方库提供了大量的扩展包,其中一些扩展包还提供了formlet抽象。
下面的简短例子在jQuery移动扩展中使用了Formlet,通过在Formlet.Do中使用flowlet布局以及组合熟悉的Formlet.Yield一起完成了两个步骤的登录序列http://www.sd-ju.com
let loginSequenceF =
Formlet.Do {
let! username, password, remember =
Formlet.Yield (fun user pass remember -> user, pass, remember)
<*> (Controls.TextField “” Theme.C “Username: ”
|> Validator.IsNotEmpty “Username cannot be empty!”)
<*> (Controls.Password “” Theme.C “Password: ”
|> Validator.IsRegexMatch “^[1-4]{4,}[0-9]$” “The password is wrong!”)
<*> Controls.Checkbox true Theme.C “Keep me logged in ”
|> Enhance.WithSubmitButton “Log in” Theme.C
let rememberText =
if remember then“”else“not ”do! Formlet.OfElement (fun _ ->
Div [
H3 [Text (“Welcome ” + username + “!”)]
P [Text (“We will ” + rememberText + “keep you logged in.”)]
])
}
|> Formlet.Flowlet
你可以使用必要的jQuery移动功能将登录序列组合进HTML标记中(可以使用多几行的代码将其很好地抽象出来),然后添加到sitelet页面上:
Div [HTML5.Attr.Data “role” “page”] -< [
Div [HTML5.Attr.Data “role” “header”] -< [
H1 [Text “WebSharper Formlets for jQuery Mobile”]>
]
Div [HTML5.Attr.Data “role” “content”] -< [
loginSequenceF
]
相关文章
- 使用AndroidFrameworks开发和应用隐藏类 or Android使用自定义framework开发与应用
- 使用IntelliJ IDEA(androidstudio前身)开发android移动应用前的基本设置,提高开发效率
- 在运行程序时报错:"如果在 Code First 模式下使用,则使用 T4 模板为 Database First 和 Model First 开发生成的代码可能无法 正常运行。若要继续使用 Database First 或 Model First,请确保在执行应用程序的 config 文件中指 定 Entity Framework 连接字符串。若要将这些从 Database First 或 Mod
- Docker 快速入门(Ubuntu版)-Docker是一个开源的平台,用于开发、部署和运行应用程序,它通过容器化技术实现应用的打包、隔离和跨平台部署。Docker 将应用程序及其所有依赖项打包到一个称为容器的标准化单元中,以便能够在任何支持 Docker 的环境中运行。这种方法使得应用程序可以无缝地在开发、测试和生产环境之间移动,消除了“在我电脑上运行没问题”的问题。
- RabbitMQ 优点和缺点- 消息可靠性:RabbitMQ 提供了持久化功能和消息确认机制,确保消息在各种情况下都能可靠地存储和处理。 灵活的路由:通过多种交换机类型和绑定规则,RabbitMQ 能够灵活地路由消息到指定的队列。 支持多种消息协议:实现了 AMQP 等(MQTT、STOMP)标准化、开放的消息队列协议,使其能够与多种语言编写的应用程序进行通信。 插件化扩展:RabbitMQ 提供了丰富的插件系统,可以通过插件扩展功能,如死信队列、压缩、追踪等。 高可用性:支持集群模式和镜像队列,确保服务的可用性 易用性和可管理性:提供了丰富的 API 和管理工具,以及多种客户端库和框架支持,易于集成和使用。 多语言支持:RabbitMQ 支持多种编程语言的客户端,包括 Java、Python、Ruby、C#、Node.js 等,方便开发人员集成到各种应用中。 高性能:在处理大量并发消息时表现出色。 广泛的社区支持:拥有庞大的开发者社区和丰富的文档资源。 劣势: 性能和吞吐量较低:相比于 Apache Kafka 等面向大数据流处理的消息队列系统,RabbitMQ 的吞吐量较低,不适合处理海量的实时数据流。RabbitMQ 的设计更注重消息的可靠性和灵活性,而非极高的吞吐性能。
- 使用Html5开发Android和iOS应用:HBuilder、Html5Plus、MUI
- 使用Xamarin开发移动应用示例——数独游戏(二)创建游戏界面
- C#开发微信门户及应用(32)--微信支付接入和API封装使用 - 伍华聪
- Mac电脑使用:您的安全性偏好设置仅允许安装来自App Store和被认可的开发者的应用(解决方法) - guo&qi
- uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式 uni-app跨平台框架介绍和快速入门uni-app跨平台框架介绍和快速入门uni-app&H5&Android混合开发一 || 最全面的uni-app离线打包Android平台教程uni-app&H5&Android混合开发二 || 使用Android Studio打包应用APKuni-app&H5&Android混合开发三 || uni-app调用And