Skip to content

Commit ff902db

Browse files
committed
Fix #208: Only include server template's initializer if needed
1 parent b7a85b4 commit ff902db

File tree

1 file changed

+48
-34
lines changed

1 file changed

+48
-34
lines changed

WebSharper.UI.Templating.Runtime/Runtime.fs

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,27 @@ type TemplateInitializer(id: string, vars: array<string * ValTy>) =
6161

6262
static let applyVarHole el tpl =
6363
match tpl with
64-
| TemplateHole.VarStr (_, v) ->
65-
BindVar.StringApply v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
66-
| TemplateHole.VarBool (_, v) ->
67-
BindVar.BoolCheckedApply v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
68-
| TemplateHole.VarInt (_, v) ->
69-
BindVar.IntApplyChecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
70-
| TemplateHole.VarIntUnchecked (_, v) ->
71-
BindVar.IntApplyUnchecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
72-
| TemplateHole.VarFloat (_, v) ->
73-
BindVar.FloatApplyChecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
74-
| TemplateHole.VarFloatUnchecked (_, v) ->
75-
BindVar.FloatApplyUnchecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
76-
| TemplateHole.Elt (n, _)
77-
| TemplateHole.Text (n, _)
78-
| TemplateHole.TextView (n, _)
79-
| TemplateHole.UninitVar (n, _)
80-
| TemplateHole.Event (n, _)
81-
| TemplateHole.EventQ (n, _)
82-
| TemplateHole.AfterRender (n, _)
83-
| TemplateHole.AfterRenderQ (n, _)
84-
| TemplateHole.Attribute (n, _) -> JavaScript.Console.Warn("Not a var hole: ", n)
64+
| TemplateHole.VarStr (_, v) ->
65+
BindVar.StringApply v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
66+
| TemplateHole.VarBool (_, v) ->
67+
BindVar.BoolCheckedApply v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
68+
| TemplateHole.VarInt (_, v) ->
69+
BindVar.IntApplyChecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
70+
| TemplateHole.VarIntUnchecked (_, v) ->
71+
BindVar.IntApplyUnchecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
72+
| TemplateHole.VarFloat (_, v) ->
73+
BindVar.FloatApplyChecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
74+
| TemplateHole.VarFloatUnchecked (_, v) ->
75+
BindVar.FloatApplyUnchecked v (fun f -> f el) (fun f -> View.Sink (f el) v.View) |> ignore
76+
| TemplateHole.Elt (n, _)
77+
| TemplateHole.Text (n, _)
78+
| TemplateHole.TextView (n, _)
79+
| TemplateHole.UninitVar (n, _)
80+
| TemplateHole.Event (n, _)
81+
| TemplateHole.EventQ (n, _)
82+
| TemplateHole.AfterRender (n, _)
83+
| TemplateHole.AfterRenderQ (n, _)
84+
| TemplateHole.Attribute (n, _) -> JavaScript.Console.Warn("Not a var hole: ", n)
8585

8686
static member Initialized = initialized
8787

@@ -157,7 +157,7 @@ and [<JavaScript>] TemplateInstances() =
157157

158158
and CompletedHoles =
159159
| Client of Dictionary<string, TemplateHole>
160-
| Server of TemplateInitializer
160+
| Server of option<TemplateInitializer>
161161

162162
and TemplateInstance(c: CompletedHoles, doc: Doc) =
163163

@@ -193,16 +193,24 @@ type Handler private () =
193193

194194
static member CompleteHoles(key: string, filledHoles: seq<TemplateHole>, vars: array<string * ValTy>) : seq<TemplateHole> * CompletedHoles =
195195
let filledVars = HashSet()
196-
for h in filledHoles do
197-
match h with
198-
| TemplateHole.VarStr(n, _)
199-
| TemplateHole.VarIntUnchecked(n, _)
200-
| TemplateHole.VarInt(n, _)
201-
| TemplateHole.VarFloatUnchecked(n, _)
202-
| TemplateHole.VarFloat(n, _)
203-
| TemplateHole.VarBool(n, _) ->
204-
filledVars.Add n |> ignore
205-
| _ -> ()
196+
let hasEventHandler =
197+
(false, filledHoles)
198+
||> Seq.fold (fun hasEventHandler h ->
199+
match h with
200+
| TemplateHole.VarStr(n, _)
201+
| TemplateHole.VarIntUnchecked(n, _)
202+
| TemplateHole.VarInt(n, _)
203+
| TemplateHole.VarFloatUnchecked(n, _)
204+
| TemplateHole.VarFloat(n, _)
205+
| TemplateHole.VarBool(n, _) ->
206+
filledVars.Add n |> ignore
207+
hasEventHandler
208+
| TemplateHole.AfterRender _
209+
| TemplateHole.AfterRenderQ _
210+
| TemplateHole.Event _
211+
| TemplateHole.EventQ _ -> true
212+
| _ -> hasEventHandler
213+
)
206214
let strHole s = TemplateHole.UninitVar(s, key + "::" + s)
207215
let extraHoles =
208216
vars |> Array.choose (fun (name, ty) ->
@@ -227,7 +235,12 @@ type Handler private () =
227235
)
228236
|> Seq.append extraHoles
229237
|> Seq.cache
230-
holes, Server (new TemplateInitializer(id = key, vars = vars))
238+
// The initializer is only needed if there are vars or the server side has filled event handlers
239+
let initializer =
240+
if hasEventHandler || not (Array.isEmpty vars) then
241+
Some (new TemplateInitializer(id = key, vars = vars))
242+
else None
243+
holes, Server initializer
231244

232245
type private RenderContext =
233246
{
@@ -787,7 +800,8 @@ type Runtime private () =
787800
Seq.empty
788801
else
789802
match completed with
790-
| CompletedHoles.Server i -> Seq.singleton (i :> IRequiresResources)
803+
| CompletedHoles.Server None -> Seq.empty
804+
| CompletedHoles.Server (Some i) -> Seq.singleton (i :> IRequiresResources)
791805
| CompletedHoles.Client _ -> failwith "Shouldn't happen"
792806
let requireResourcesSeq = Seq.append tplInstance requireResources.Values
793807
let write extraAttrs ctx w r =

0 commit comments

Comments
 (0)