在 Websharper 中为 JS.Window.Onpopstate 编写处理程序
Writing handlers for JS.Window.Onpopstate in Websharper
我正在尝试在我的 WebSharper 应用程序中获得适当的后退按钮支持。我可以把东西放在历史上就好了:
type MyRecord = { foo: int; bar: string }
JS.Window.History.PushState({foo=10; bar="hello"}, "", "mysuffix")
我希望通过执行以下操作为 onpopstate
添加相应的处理程序:
JS.Window.Onpopstate <- (fun e -> Javascript.Console.Info e.State.bar)
很遗憾,此事件的类型为 Js.Window.Onpopstate : Dom.Event -> Unit
Dom.Event
没有用于返回状态的字段 State
,即使对应的 "real" Javascript 事件有。
如何在 Onpopstate
处理程序中访问使用 PushState
存储的状态?
事实证明,您可以像这样从任意 Javascript 中检索值:
[<Inline "$e.state">]
let stateOf (e : JavaScript.Dom.Event) =
Unchecked.defaultof<MyRecord>
我现在可以编写我的 onpopstate
处理程序:
JS.Window.Onpopstate <- (fun e ->
Javascript.Console.Info ((stateOf e).bar)
)
需要注意的是,提供嵌套记录、class 类型参数和设置为 PushState
通常不起作用。浏览器有义务仅存储您传递给 PushState
的任何内容的 JSON 可序列化部分;并且刚才提到的所有类型都实现为 Javascript 对象。
您可以使用动态运算符从对象访问任意字段 ?
:
JS.Window.Onpopstate <- (fun e ->
Console.Info e?state.bar
)
但是请注意,您仍然需要使用 [<Inline>]
来调用任意方法。
我正在尝试在我的 WebSharper 应用程序中获得适当的后退按钮支持。我可以把东西放在历史上就好了:
type MyRecord = { foo: int; bar: string }
JS.Window.History.PushState({foo=10; bar="hello"}, "", "mysuffix")
我希望通过执行以下操作为 onpopstate
添加相应的处理程序:
JS.Window.Onpopstate <- (fun e -> Javascript.Console.Info e.State.bar)
很遗憾,此事件的类型为 Js.Window.Onpopstate : Dom.Event -> Unit
Dom.Event
没有用于返回状态的字段 State
,即使对应的 "real" Javascript 事件有。
如何在 Onpopstate
处理程序中访问使用 PushState
存储的状态?
事实证明,您可以像这样从任意 Javascript 中检索值:
[<Inline "$e.state">]
let stateOf (e : JavaScript.Dom.Event) =
Unchecked.defaultof<MyRecord>
我现在可以编写我的 onpopstate
处理程序:
JS.Window.Onpopstate <- (fun e ->
Javascript.Console.Info ((stateOf e).bar)
)
需要注意的是,提供嵌套记录、class 类型参数和设置为 PushState
通常不起作用。浏览器有义务仅存储您传递给 PushState
的任何内容的 JSON 可序列化部分;并且刚才提到的所有类型都实现为 Javascript 对象。
您可以使用动态运算符从对象访问任意字段 ?
:
JS.Window.Onpopstate <- (fun e ->
Console.Info e?state.bar
)
但是请注意,您仍然需要使用 [<Inline>]
来调用任意方法。