2

我正在尝试在我的 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返回状态的字段,即使相应的“真实”Javascript 事件有。

如何访问存储PushStateOnpopstate处理程序中的状态?

4

2 回答 2

2

您可以使用动态运算符从对象访问任意字段?

JS.Window.Onpopstate <- (fun e ->
    Console.Info e?state.bar
)

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

于 2015-05-15T16:27:16.177 回答
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)
)

需要注意的是,提供嵌套记录、类类型参数和 Sets toPushState通常是行不通的。浏览器有义务仅存储您传递给的任何内容的 JSON 可序列化部分PushState;并且刚才提到的所有类型都实现为 Javascript 对象。

于 2015-05-13T15:42:55.333 回答