2013-04-09 6 views
5

Chcę tylko jakoś powiedzieć „Chcę wszystkich metod w tym wykorzystania projektu [JavaScript]” Ręcznie adnotacja każda metoda jest denerwująceCzy jest jakiś sposób domyślnie użyć atrybutu JavaScript?

+0

Nie, ale też nie powinny być w ten sposób - metody po stronie serwera nie muszą być opatrzone '[]' (ponieważ używają funkcji, które nie są dostępne na stronie klienta). –

+0

Również znajduję kod zalany [] naprawdę denerwujący. Jest to jeden z powodów, dla których zdecydowałem się użyć zamiast tego maszynopisu. Jednym z możliwych rozwiązań może być oznaczenie całego modułu lub klasy jako JavaScript. Czy to nie jest możliwe? –

+0

Jest to możliwe, sprawdź moją odpowiedź na przykład. – Taha

Odpowiedz

6

F # 3 pozwala oznaczyć moduł z atrybutem ReflectedDefinition (aka [JavaScript] w WebSharper), który oznacza wszystkie metody pod spodem.

Zobacz More About F# 3.0 Language Features:

(Mówiąc o niezwykłych cech, w F # 3.0 The [< ReflectedDefinition>] atrybut może teraz zostać umieszczone na modułach i definicji typu, jako uproszczony sposób, aby zastosować go do . każda jednostka członkiem modułu/typ)

+1

Dla przykładu, możesz sprawdzić moje ostatnie próbki FunScript (myślę, że ta sama struktura kodu będzie działać również w WebSharper): https://github.com/tpetricek/Documents/blob/master/Talks%202013/Love%20The % 20Data% 20 (Channel9) /code/WorldBank.Web/Page.fs –

3

myślę odpowiedź Phila jest droga - kiedy można oznaczyć cały moduł lub typ, nie dodawać zbyt dużo hałasu, a także pozwala na odróżnić między kodem po stronie serwera i po stronie klienta w WebSharper.

Po prostu dla zapisu, kompilator F # jest open-source, więc ktoś (który uważa, że ​​ten problem jest ważny) może z łatwością utworzyć gałąź, która doda dodatkowy atrybut wiersza poleceń, aby nadpisać ustawienie. Myślę, że to tylko kwestia dodania parametru, a następnie ustawienia domyślnej wartości flagi reflect w check.fs (tutaj is the source on GitHub).

Obecnie głównym F # repozytorium nie akceptuje składki, które dodają nowe funkcje (patrz discussion here), ale z pewnością jest to dobry sposób, aby wysłać żądanie funkcji do # zespół F :-)

2

If ty sklasyfikujesz cały kod za pomocą atrybutu JavaScript, kompilator WebSharper spróbuje przetłumaczyć wszystko na JavaScript. Regułą w rozwoju WebSharper jest odseparowanie kodu po stronie serwera i po stronie klienta, więc możesz po prostu opisać moduł/klasę zawierającą kod po stronie klienta zamiast każdej funkcji/członka, jeśli kierujesz się na .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

Używam websharper tylko do wymiany javascript, więc nie dbam o stronę serwera, tak czy inaczej adnotacja modułu jest znacznie lepsza niż metoda. – ais

Powiązane problemy