跳到內容

d3-dispatch

派送是一種低階互動機制,允許您註冊具名稱的回呼,然後使用任意參數呼叫它們。各種 D3 互動元件,例如 d3-drag,使用 dispatch 向監聽器發出事件。可以將其視為 EventTarget,但每個監聽器都有明確定義的名稱,因此可以輕鬆移除或替換它們。

例如,要為 startend 事件建立派送

js
const dispatch = d3.dispatch("start", "end");

然後,您可以使用 dispatch.on 為這些事件註冊回呼

js
dispatch.on("start", callback1);
dispatch.on("start.foo", callback2);
dispatch.on("end", callback3);

接著,您可以使用 dispatch.calldispatch.apply 呼叫所有 start 回呼

js
dispatch.call("start");

function.call 類似,您也可以指定 this 的內容和任何參數

js
dispatch.call("start", {about: "I am a context object"}, "I am an argument");

dispatch(...types)

來源 · 為指定的事件 types 建立新的 dispatch。每個 type 都是一個字串,例如 "start""end"

dispatch.on(typenames, callback)

來源 · 新增、移除或取得指定 typenamescallback。如果指定了 callback 函式,則會為指定的(完全限定的)typenames 註冊該函式。如果已為指定的 typenames 註冊了 callback,則會在新增新的 callback 之前移除現有的 callback。

指定的 typenames 是字串,例如 startend.foo。類型可以選擇性地加上一個句點(.)和一個名稱;選擇性的名稱允許註冊多個 callback 來接收同種類型的事件,例如 start.foostart.bar。若要指定多個 typenames,請使用空白分隔 typenames,例如 start endstart.foo start.bar

若要移除給定名稱 foo 的所有 callback,請使用 dispatch.on(".foo", null)

如果未指定 callback,則會傳回指定的 typenames 的目前 callback(如果有的話)。如果指定了多個 typenames,則會傳回第一個符合的 callback。

dispatch.copy()

來源 · 傳回此 dispatch 物件的副本。對此 dispatch 的變更不會影響傳回的副本,反之亦然。

dispatch.call(type, that, ...arguments)

來源 · 類似 function.call,呼叫為指定的 type 註冊的每個 callback,將指定的 ...argument 傳遞給 callback,並將 that 作為 this 的內容。請參閱 dispatch.apply 以取得更多資訊。

dispatch.apply(type, that, arguments)

來源 · 類似 function.apply,呼叫為指定的 type 註冊的每個 callback,將指定的 arguments 傳遞給 callback,並將 that 作為 this 的內容。例如,如果您想在處理原生 click 事件後,在保留目前 this 的內容和引數的情況下,發送您的 custom callback,您可以使用

js
selection.on("click", function() {
  dispatch.apply("custom", this, arguments);
});

您可以將任何想要的參數傳遞給回呼函式;最常見的情況是,您可能會建立一個表示事件的物件,或傳遞目前的資料點 (d) 和索引 (i)。請參閱 function.callfunction.apply 以取得更多資訊。