websharper中的JS.Window.onpopstate编写处理程序



我正在尝试在我的websharper-app中获得适当的后按钮支持。我可以把东西放在历史上很好:

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即使相应的"真实" JavaScript事件确实可以,Dom.Event也没有恢复状态的字段State

如何访问Onpopstate处理程序中使用PushState的状态?

您可以使用动态操作员?

从对象访问任意字段
JS.Window.Onpopstate <- (fun e ->
    Console.Info e?state.bar
)

但是,您仍然需要使用[<Inline>]调用任意方法。

事实证明,您可以从任意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)
)

警告是提供嵌套的记录,类式参数,并将设置为PushState一般不起作用。浏览器有义务仅存储任何您传递给 PushState的json serializable部分;并且所有提到的类型均被实现为JavaScript对象。

最新更新