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