連線預覽器會為待處理的連線建立視覺預覽畫面。這可讓您瞭解拖曳的區塊在放置時會連結至何處。
預設的連線預覽工具會在區塊連結處放置插入標記。它也會強調連線,並在將要取代和中斷的區塊上套用淡出效果。
待處理連線的類型
有兩種待處理的連線。在某些情況下,已放置的區塊會取代現有區塊,而現有區塊會遭到中斷。在另一種情況下,系統會插入已刪除的區塊,但不會中斷其他區塊。
替換
當拖曳的區塊上的連線要連結至已包含區塊的連線,且現有區塊無處可重新連結時,就會發生替換。拖曳的方塊放置後,系統會中斷已取代的方塊,並將拖曳的方塊連結至該位置。
根據預設,我們會在要替換的區塊上加入淡出效果,以此表示這項操作。
插入
插入作業會在兩種情況下發生。當拖曳的區塊上的連線要連結至空白的連線時,就會發生這種情況。當拖曳的區塊連線至已連結區塊時,就會發生這種情況。但這類連線可插入兩個現有區塊之間,因此現有區塊不會中斷連線。
根據預設,我們會建立插入標記,並醒目顯示要連結的連線,以此表示這項資訊。
建立自訂預覽工具
如果您想使用其他視覺效果來預覽待處理的連線,可以建立自訂 IConnectionPreviewer
實作項目。
建造和處置
您需要為 IConnectionPreviewer
實作建構函式和處置方法。
每當區塊拖曳作業開始時,系統就會呼叫建構函式,並傳遞正在拖曳的區塊。如果您需要根據區塊初始化任何狀態,可以在建構函式中執行這項操作。
class MyConnectionPreviewer implements IConnectionPreviewer {
constructor(draggedBlock: Blockly.BlockSvg) {
// Initialize state here.
}
}
每當拖曳區塊結束時,系統都會呼叫 dispose
方法。如果您需要在 IConnectionPreviewer
例項處置時解參任何狀態,請在此執行此操作。
dispose() {
// Dispose of and dereference any state.
}
建立預覽畫面
您的 IConnectionPreviewer
需要實作用於視覺預覽連線的邏輯。
替換
如要預覽替換項目,請實作 previewReplacement
方法。
previewReplacement(draggedConn, staticConn, replacedBlock) {
// Visually indicate that the replacedBlock will be disconnected, and the
// draggedConn will be connected to the staticConn.
}
插入
如要預覽插入內容,請實作 previewConnection
方法。
previewConnection(draggedConn, staticConn) {
// Visually indicate the draggedConn will be connected to the staticConn.
}
如果您想根據拖曳的方塊是否連結到空白輸入內容,或是否插入方塊之間,顯示不同的預覽畫面,可以檢查 staticConn
目前是否已連結到其他連線。如果 staticConn
目前已連線,則 draggedConn
會插入區塊之間。
previewConnection(draggedConn, staticConn) {
if (staticConn.targetConnection) {
// The dragged block is being inserted between blocks.
} else {
// The dragged block is connecting to an empty input.
}
}
CSS 預覽
您可以將 CSS 套用至區塊,預覽連線。舉例來說,您可以將 blocklyReplaceable
CSS 類別新增至區塊,藉此切換預設的替換淡出效果。
previewReplacement(draggedConn, staticConn, replacedBlock) {
Blockly.utils.dom.addClass(replacedblock.getSvgRoot(), 'my-custom-class');
}
轉譯器預覽
您可以實作具有特殊預覽鉤子的自訂轉譯器,藉此預覽連線。
previewReplacement(draggedConn, staticConn, replacedBlock) {
const renderer = replacedBlock.workspace.getRenderer()
if (renderer.addReplacementIndicator) {
renderer.addReplacementIndicator(replacedBlock);
}
}
隱藏預覽畫面
IConnectionPreviewer
必須能夠隱藏預覽畫面。當拖曳的區塊超出所有連線的範圍時,系統就會呼叫這個方法,因此不會顯示預覽畫面。系統也會在預覽器處置前呼叫此方法。
hidePreview() {
// Remove CSS classes, toggle renderer methods, etc.
}
註冊和使用
最後,完成 IConnectionPreviewer
建立作業後,您需要註冊該項目。這會將轉譯器與字串建立關聯,以便您將其傳遞至設定選項。您也可以直接將 IConnectionPreviewer
類別 (即建構函式) 傳遞至設定選項。
Blockly.registry.register(
Blockly.registry.Type.CONNECTION_PREVIEWER,
'MyConnectionPreviewer',
MyConnectionPreviewer,
);
// You can use the string.
const myWorkspace = Blockly.inject({
// options...
plugins: {
connectionPreviewer: 'myConnectionPreviewer',
},
};
// Or you can pass the class / constructor directly.
const myWorkspace = Blockly.inject({
// options...
plugins: {
connectionPreviewer: MyConnectionPreviewer,
},
};
如要進一步瞭解註冊功能,請參閱「插入子類別」。