2013-04-09 84 views
5

我只是想以某种方式说:“我想在这个项目中使用的所有方法[的JavaScript]” 手动注释每一个方法是烦人默认情况下有什么方法可以使用JavaScript属性吗?

+0

没有,但也它不应该是这样 - 服务器端方法不能与'[]被标注'(因为它们使用的功能是不可用的客户端)。 – 2013-04-09 09:38:51

+0

我还发现充斥着[]的代码真的很烦人。这是我决定改用Typescript的原因之一。一种可能的解决方案可能是将整个模块或类标记为JavaScript。或者这是不可能的? – 2013-04-09 12:15:53

+0

这是可能的,查看我的答案为例。 – Taha 2013-04-09 17:09:20

回答

6

F#3,您可以标记与ReflectedDefinition属性(又名[的JavaScript在WebSharper模块)它标记下面的所有方法。

参见More About F# 3.0 Language Features

(罕见的属性的地说,在F#3.0中, [< ReflectedDefinition>]属性现在可以被放置在模块和 类型定义,将其应用到一个速记方式。模块/类型的每一个人 成员)

+1

举一个例子,你可以看看我最近的FunScript样品(我认为相同的代码结构将在WebSharper工作太):https://github.com/tpetricek/Documents/blob/master/Talks%202013/Love%20The %20Data%20(Channel9的)/code/WorldBank.Web/Page.fs – 2013-04-09 12:42:33

3

我认为菲尔的回答是要走的路 - 当你可以标记整个模块或类型,它不会添加太多的噪音,同时也可以让你区分WebSharper中的服务器端和客户端代码之间。

只是为了记录在案,F#编译器是开源的,因此有人(谁发现这个问题很重要),可以很容易地建立分公司,将添加一个额外的命令行属性来覆盖该设置。我认为这仅仅是添加参数,然后在check.fs(这里is the source on GitHub)设置reflect标志的默认值的问题。

目前,主要的F#库不接受增加新功能的贡献(见discussion here),但可以肯定的是发送的功能要求F#团队:-)

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() :> _ 
+0

我用websharper只针对JavaScript的更换,所以我真的不关心服务器端,反正模块注释好得多然后方式。 – ais 2013-04-09 17:13:56

相关问题