d3-dispatch
派送是一種低階互動機制,允許您註冊具名稱的回呼,然後使用任意參數呼叫它們。各種 D3 互動元件,例如 d3-drag,使用 dispatch 向監聽器發出事件。可以將其視為 EventTarget,但每個監聽器都有明確定義的名稱,因此可以輕鬆移除或替換它們。
例如,要為 start 和 end 事件建立派送
const dispatch = d3.dispatch("start", "end");
然後,您可以使用 dispatch.on 為這些事件註冊回呼
dispatch.on("start", callback1);
dispatch.on("start.foo", callback2);
dispatch.on("end", callback3);
接著,您可以使用 dispatch.call 或 dispatch.apply 呼叫所有 start 回呼
dispatch.call("start");
與 function.call 類似,您也可以指定 this
的內容和任何參數
dispatch.call("start", {about: "I am a context object"}, "I am an argument");
dispatch(...types)
來源 · 為指定的事件 types 建立新的 dispatch。每個 type 都是一個字串,例如 "start"
或 "end"
。
dispatch.on(typenames, callback)
來源 · 新增、移除或取得指定 typenames 的 callback。如果指定了 callback 函式,則會為指定的(完全限定的)typenames 註冊該函式。如果已為指定的 typenames 註冊了 callback,則會在新增新的 callback 之前移除現有的 callback。
指定的 typenames 是字串,例如 start
或 end.foo
。類型可以選擇性地加上一個句點(.
)和一個名稱;選擇性的名稱允許註冊多個 callback 來接收同種類型的事件,例如 start.foo
和 start.bar
。若要指定多個 typenames,請使用空白分隔 typenames,例如 start end
或 start.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,您可以使用
selection.on("click", function() {
dispatch.apply("custom", this, arguments);
});
您可以將任何想要的參數傳遞給回呼函式;最常見的情況是,您可能會建立一個表示事件的物件,或傳遞目前的資料點 (d) 和索引 (i)。請參閱 function.call 和 function.apply 以取得更多資訊。