Написание обработчиков для JS.Window.Onpopstate в 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 для возврата состояния, хотя соответствующее "настоящее" событие Javascript имеет.

Как получить доступ к состоянию, сохраненному с помощью PushState в обработчике Onpopstate?


person Søren Debois    schedule 11.05.2015    source источник


Ответы (2)


Вы можете получить доступ к произвольным полям из объектов с помощью динамического оператора ?:

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

Однако обратите внимание, что вам все равно нужно использовать [<Inline>] для вызова произвольного метода.

person Tarmil    schedule 15.05.2015

Оказывается, вы можете получить значения из произвольного 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 в общем случае не работает. Браузер обязан хранить только сериализуемую в формате JSON часть того, что вы передаете PushState; и все только что упомянутые типы реализованы как объекты Javascript.

person Søren Debois    schedule 13.05.2015