【问题标题】:Is there any way to use JavaScript attribute by default?有没有办法默认使用 JavaScript 属性?
【发布时间】:2013-03-31 15:22:31
【问题描述】:

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

【问题讨论】:

  • 不,但也不应该这样 - 服务器端方法不能用 [<JavaScript>] 注释(因为它们使用客户端不可用的功能)。
  • 我还发现充斥着 [] 的代码真的很烦人。这也是我决定改用 Typescript 的原因之一。一种可能的解决方案是将整个模块或类标记为 JavaScript。还是那不可能?
  • 有可能,请查看我的答案作为示例。

标签: f# websharper


【解决方案1】:

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

More About F# 3.0 Language Features:

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果您使用 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() :> _
    

    【讨论】:

    • 我只使用 websharper 替换 javascript,所以我并不关心服务器端,反正模块注释比方法好得多。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多