有没有办法默认使用JavaScript属性?

时间:2013-04-09 09:09:13

标签: f# websharper

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

3 个答案:

答案 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() :> _