在Websharper中为JS.Window.Onpopstate编写处理程序

时间:2015-05-11 13:47:43

标签: f# browser-history websharper

我试图在我的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 并且Dom.Event没有字段State来取回州,即使相应的&#34;真实&#34; Javascript事件。

如何在PushState处理程序中访问与Onpopstate一起存储的状态?

2 个答案:

答案 0 :(得分:2)

您可以使用动态运算符?

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

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

答案 1 :(得分:0)

事实证明,您可以从任意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可序列化部分;刚才提到的所有类型都是作为Javascript对象实现的。