@@ -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
158158and CompletedHoles =
159159 | Client of Dictionary < string , TemplateHole >
160- | Server of TemplateInitializer
160+ | Server of option < TemplateInitializer >
161161
162162and 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
232245type 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