我只是想以某种方式说“我希望这个项目中的所有方法都使用[JavaScript]” 手动注释每个方法都很烦人
答案 0 :(得分:6)
F#3允许您使用ReflectedDefinition属性(在WebSharper中称为[JavaScript])标记模块,该属性标记下面的所有方法。
请参阅More About F# 3.0 Language Features:
(说到不常见的属性,在F#3.0中, 并[d ReflectedDefinition>]属性现在可以放在模块和 类型定义,作为将其应用于每个人的简写方式 模块/类型的成员。)
答案 1 :(得分:3)
我认为Phil的答案是要走的路 - 当你可以标记整个模块或类型时,它不会增加太多噪音,它还允许你区分WebSharper中的服务器端和客户端代码。 / p>
仅为了记录,F#编译器是开源的,因此有人(发现此问题很重要)可以轻松创建一个分支,该分支将添加一个额外的命令行属性来覆盖该设置。我想这只是添加参数然后在reflect
(此处为is the source on GitHub)中设置check.fs
标志的默认值。
目前,主要的F#存储库不接受添加新功能的贡献(请参阅discussion here),但它确实是向F#团队发送功能请求的好方法: - )
答案 2 :(得分:2)
如果使用JavaScript属性注释所有代码,WebSharper编译器将尝试将所有内容转换为JavaScript。 WebSharper开发的一个经验法则是分离服务器端和客户端代码,因此如果您的目标是.NET 4.5,则可以简单地注释包含客户端代码的模块/类,而不是每个函数/成员。
namespace Website
open IntelliFactory.WebSharper
module HelloWorld =
module private Server =
[<Rpc>]
let main() = async { return "World" }
[<JavaScript>] // or [<ReflectedDefinition>]
module Client =
open IntelliFactory.WebSharper.Html
let sayHello() =
async {
let! world = Server.main()
JavaScript.Alert <| "Hello " + world
}
let btn =
Button [Text "Click Me"]
|>! OnClick (fun _ _ ->
async {
do! sayHello()
} |> Async.Start)
let main() = Div [btn]
type Control() =
inherit Web.Control()
[<JavaScript>]
override __.Body = Client.main() :> _