Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 默认情况下有没有办法使用JavaScript属性?_F#_Websharper - Fatal编程技术网

F# 默认情况下有没有办法使用JavaScript属性?

F# 默认情况下有没有办法使用JavaScript属性?,f#,websharper,F#,Websharper,我只是想说“我希望这个项目中的所有方法都使用[JavaScript]” 手动注释每个方法都很烦人F#3允许您使用标记下面所有方法的属性(WebSharper中的aka[JavaScript])标记模块 见: (说到不寻常的属性,在F#3.0中 []属性现在可以放置在模块和 类型定义,作为将其应用于每个个体的简写方式 模块/类型的成员。) 我认为Phil的答案是正确的——当您可以标记整个模块或类型时,它不会增加太多噪音,并且还允许您在WebSharper中区分服务器端代码和客户端代码 请注意,F#

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

F#3允许您使用标记下面所有方法的属性(WebSharper中的aka[JavaScript])标记模块

见:

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


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

请注意,F#编译器是开源的,因此有人(认为这个问题很重要)可以轻松创建分支,添加额外的命令行属性来覆盖设置。我认为这只是添加参数的问题,然后在
check.fs
(此处)中设置
reflect
标志的默认值


目前,主F#repository不接受添加新功能的贡献(请参阅),但向F#团队发送功能请求肯定是一个好方法:-)

如果您使用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() :> _
名称空间网站
打开IntelliFactory.WebSharper
模块HelloWorld=
模块专用服务器=
[]
让main()=async{返回“World”}
[//或[]
模块客户端=
打开IntelliFactory.WebSharper.Html
让我们说你好=
异步的{
让!world=Server.main()
JavaScript.Alert!OnClick(有趣的)
异步的{
做!说你好()
}|>Async.Start)
设main()=Div[btn]
类型控制()=
继承Web.Control()
[]
覆盖_uu.Body=Client.main():>_

不,但也不应该这样-服务器端方法不能用
[]
注释(因为它们使用的功能在客户端不可用)。我还发现代码中充斥着[]真的很烦人。这就是我决定改用Typescript的原因之一。一个可能的解决方案可能是将整个模块或类标记为JavaScript。或者这不可能吗?有可能,请查看我的答案中的示例。例如,您可以查看我最近的FunScript示例(我认为同样的代码结构也适用于WebSharper):我使用WebSharper只是为了替换javascript,所以我并不真正关心服务器端,无论如何模块注释比方法要好得多。