5

我只想以某种方式说“我希望这个项目中的所有方法都使用[JavaScript]”手动注释每个方法都很烦人

4

3 回答 3

6

F# 3 允许您使用ReflectedDefinition属性(在 WebSharper 中也称为 [JavaScript])标记模块,该属性标记下面的所有方法。

查看有关 F# 3.0 语言功能的更多信息:

(说到不常见的属性,在 F# 3.0 中,[< ReflectedDefinition >] 属性现在可以放在模块和类型定义上,作为将其应用于模块/类型的每个单独成员的简写方式。)

于 2013-04-09T12:40:49.803 回答
3

我认为 Phil 的答案是要走的路——当你可以标记整个模块或类型时,它不会增加太多噪音,它还允许你区分 WebSharper 中的服务器端和客户端代码。

仅作记录,F# 编译器是开源的,因此某人(认为此问题很重要)可以轻松创建分支,该分支将添加一个额外的命令行属性来覆盖该设置。我认为这只是添加参数然后在中设置reflect标志的默认值的问题check.fs(这里是 GitHub 上的源代码)。

目前,主要 F# 存储库不接受添加新功能的贡献(请参阅此处的讨论),但这无疑是向 F# 团队发送功能请求的好方法 :-)

于 2013-04-09T13:00:53.077 回答
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() :> _
于 2013-04-09T13:22:28.527 回答