התאמה אישית מתקדמת

‫Blockly מאפשרת לכם להתאים אישית פונקציונליות מסוימת על ידי החלפה של מחלקות Blockly המתאימות.

שיעורים שניתן להחליף

אפשר להחליף את המחלקות הבאות של Blockly:

שיעור Blockly ממשק שם סוג המרשם
Blockly.dragging.Dragger Blockly.IDragger blockDragger
Blockly.ConnectionChecker Blockly.IConnectionChecker connectionChecker
Blockly.InsertionMarkerPreviewer Blockly.IConnectionPreviewer connectionPreviewer
Blockly.HorizontalFlyout Blockly.IFlyout flyoutsHorizontalToolbox
Blockly.VerticalFlyout Blockly.IFlyout flyoutsVerticalToolbox
Blockly.MetricsManager Blockly.IMetricsManager metricsManager
Blockly.Toolbox Blockly.IToolbox toolbox
Blockly.VariableMap Blockly.IVariableMap variableMap
Blockly.VariableModel Blockly.IVariableModel --

במאמר יצירת רכיבי עיבוד מותאמים אישית מוסבר איך להחליף רכיב עיבוד.

יצירת כיתה חלופית

כדי ליצור מחלקה חלופית, מטמיעים את הפונקציות בממשק המתאים. אפשר להטמיע את כל הפונקציות האלה בכיתה חדשה, או להרחיב את הכיתה Blockly ולשנות רק את הפונקציות שרוצים לשנות. הדרישה היחידה היא שאתם (או מחלקת הבסיס) תטמיעו את כל הפונקציות בממשק ותקפידו על כל הדרישות שמתוארות בהערות בממשק.

כדי לציין בבודק הסוגים שהטמעתם ממשק ספציפי, מוסיפים הערה לכיתה באמצעות התג @implements {InterfaceName} JSDoc (ב-JavaScript) או מילת המפתח implements (ב-TypeScript).

הודעה ל-Blockly על מחלקת ההחלפה

יש שתי דרכים להגדיר את מחלקת ההחלפה ב-Blockly: לרשום אותה כמחלקת ברירת המחדל של הסוג שלה (המומלצת), או להוסיף אותה באמצעות אפשרות ההגדרה plugins.

רישום הכיתה החלופית כברירת מחדל

הדרך המומלצת להגדיר ב-Blockly את מחלקת ההחלפה היא לרשום אותה כברירת המחדל לסוג שלה. כדי לעשות זאת, קוראים לפונקציה Blockly.registry.register באמצעות השם Blockly.registry.DEFAULT ומגדירים את הפרמטר opt_allowOverrides לערך true.

Blockly.registry.register(
  Blockly.registry.Type.VARIABLE_MODEL,
  Blockly.registry.DEFAULT,
  CustomVariableModel,
  true,
);

הוספת הכיתה החלופית

אפשר גם להחדיר מחלקות חלופיות באמצעות plugins configuration option. זהו אובייקט שמשתמש בשמות סוגי רישום כשמות מאפיינים ובמחלקות החלפה או בשמות רשומים כערכי מאפיינים.

(למרות השם של המאפיין plugins, לא צריך לארוז את המחלקה ולהפיץ אותה דרך npm כמו התוספים שמשמשים להרחבת Blockly).

מעבירים את המחלקה החלופית אל Blockly.inject:

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': CustomMetricsManagerClass
  }
}

אפשר גם לרשום את הכיתה באמצעות Blockly.registry.register ולהעביר את השם הרשום אל Blockly.inject. האפשרות הזו שימושית אם אתם מאחסנים את אפשרויות ההגדרה שלכם כ-JSON טהור.

Blockly.registry.register(Blockly.registry.Type.METRICS_MANAGER, 'YOUR_NAME', CustomMetricsManagerClass);

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': 'YOUR_NAME'
  }
}