1

我想做类似的事情:

open Webapi.Dom;

let addListener = (element) =>
    EventTarget.addEventListener("click", onSubscribeClick, EventTarget.asEventTarget(element));

let addOrRemoveListeners = (handler, ()) => {
    let elements = Document.querySelectorAll({j|[$subscriptionIdAttr]|j}, document);
    Js.Array.forEach(handler, NodeListRe.toArray(elements) |> Js.Array.map(Element.ofNode))
  };

let addListeners = addOrRemoveListeners(addListener);

let removeListeners = addOrRemoveListeners(removeListener);

但我得到一个错误addOrRemoveListeners(addListener);

This is:
  (Dom.eventTarget) => unit
But somewhere wanted:
  (Dom.node) => unit

我应该如何从 转换Dom.eventTargetDom.node


编辑:我最终得到了这个:

let addListener = Element.addEventListener("click", onSubscribeClick);
let removeListener = Element.removeEventListener("click", onSubscribeClick);
let addOrRemoveListeners = (handler, ()) => {
  let elements = Document.querySelectorAll({j|[$(subscriptionIdAttr)]|j}, document);
  let () =
    elements
    |> NodeListRe.toArray
    |> Array.map(Element.ofNode)
    |> Array.to_list
    |> List.filter(Js.Option.isSome)
    |> List.map(Js.Option.getExn)
    |> List.iter(handler);
  ()
};
let addListeners = addOrRemoveListeners(addListener);
let removeListeners = addOrRemoveListeners(removeListener);
4

1 回答 1

1

简短的回答:

external eventTargetToNode : Dom.eventTarget => Dom.node = "%identity";

AneventTarget几乎可以是任何东西,不幸的是没有很好的方法来弄清楚它是什么。在 JavaScript 中,它只是由用户根据上下文推断出来的(可能可以在类型参数中携带该上下文,但将来会在某个地方关闭)。

因此,目前您必须进行不安全的演员表才能获得所需的内容。

(顺便说一句,您可以使用Element.addEventListener来避免从elementto 转换eventTarget

于 2017-11-13T11:55:44.410 回答