Blockly 探索之旅 — 工具箱

前面已經(jīng)成功將Blockly注入到了網(wǎng)頁中,得到了一個工作區(qū),但是里面空空如也,什么事都做不了。因此本章要做的就是往工作區(qū)里添加工具箱,有了工具箱才算是真正的開始了

還記得之前注入應(yīng)用時調(diào)用的注入接口嗎,Blockly.inject(blocklyDiv, {});,里面的大括號當(dāng)時留空了。其實工作區(qū)的所有配置都是通過這里傳入,包括工具箱。在傳入工具箱配置到工作區(qū)前,需要知道怎么定義工具箱。

準(zhǔn)備工作

在想怎么定義工具箱之前,必須先把依賴的核心模塊包含到網(wǎng)頁中。少了這個這個模塊,即使工具箱定義沒問題,也正確傳入了工作區(qū)中,連之前得到的工作區(qū)都看不到,更別說工具箱。

<script src="./node_modules/blockly/blocks_compressed.js"></script>

工具箱定義格式

官方推薦使用JSON,那就用這個吧。下面是一個簡單的演示,工具箱中只有兩個塊

var toolbox = {
    "kind": "flyoutToolbox",
    "contents": [
      {
        "kind": "block",
        "type": "controls_if"
      },
      {
        "kind": "block",
        "type": "controls_whileUntil"
      }
    ]
  };
var workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox});

有點小興奮。。。。。

分類

上面的工具箱太簡單了,實際應(yīng)用中幾個塊是做不了啥事的。但是那么多的塊丟到一起,茫?!皦K”海何處尋。因此給塊分門別類是非常有必要的。看下面的JSON就明白了,不多說

        var toolbox = {
            "kind": "categoryToolbox",
            "contents": [
                {
                    "kind": "category",
                    "name": "Control",
                    "contents": [
                        {
                            "kind": "block",
                            "type": "controls_if"
                        },
                    ]
                },
                {
                    "kind": "category",
                    "name": "Logic",
                    "contents": [
                        {
                            "kind": "block",
                            "type": "logic_compare"
                        },
                        {
                            "kind": "block",
                            "type": "logic_operation"
                        },
                        {
                            "kind": "block",
                            "type": "logic_boolean"
                        }
                    ]
                }
            ]
        };

可以看到是按定義的一樣增加了兩個類別,而且垃圾桶這個元素也出現(xiàn)了

分類嵌套

如果塊的數(shù)量真的太多了,單層分類也不好找的時候,可以繼續(xù)嵌套分類,把上面的JSON簡單改一下

        var toolbox = {
            "kind": "categoryToolbox",
            "contents": [
                {
                    "kind": "category",
                    "name": "Core",
                    "contents": [
                        {
                            "kind": "block",
                            "type": "controls_if"
                        },
                        {
                            "kind": "block",
                            "type": "logic_compare"
                        },
                    ]
                },
                {
                    "kind": "category",
                    "name": "Custom",
                    "contents": [
                        {
                            "kind": "block",
                            "type": "start"
                        },
                        {
                            "kind": "category",
                            "name": "Move",
                            "contents": [
                                {
                                    "kind": "block",
                                    "type": "move_forward"
                                }
                            ]
                        },
                        {
                            "kind": "category",
                            "name": "Turn",
                            "contents": [
                                {
                                    "kind": "block",
                                    "type": "turn_left"
                                }
                            ]
                        }
                    ]
                }
            ]
        };

可以看到,現(xiàn)在支持二層分類了

動態(tài)分類

Blockly 允許通過注冊的字符串鍵將一個類別與一個函數(shù)聯(lián)系起來,從而實現(xiàn)支持動態(tài)分類。
這里留個坑,后面再補
主要介紹一下Blockly內(nèi)建支持的動態(tài)分類。

內(nèi)建動態(tài)分類

Blockly提供了兩個內(nèi)置的動態(tài)類別,一個創(chuàng)建變量類別,另一個創(chuàng)建函數(shù)類別。它們的字符串鍵分別是'VARIABLE'和'PROCEDURE'。按如下方式將其添加到工具箱中

{
  "kind": "category",
  "name": "Variables",
  "custom": "VARIABLE"
},
{
  "kind": "category",
  "name": "Functions",
  "custom": "PROCEDURE"
}

創(chuàng)建變量這里只有一個按鈕,點擊它會彈出一個對話框,讓你輸入變量名字,輸入后就會得到對該變量的三個操作方法

函數(shù)這里的塊,名字上看起來總是有點別扭

對于分類的配置還有不少內(nèi)容,比如禁用、隱藏、展開、風(fēng)格、訪問等,這些就。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。留坑留坑

預(yù)設(shè)塊

工具箱定義可以包含有字段設(shè)置為默認(rèn)值的塊,或者有已經(jīng)連接在一起的塊。先直觀的看看是啥樣子

還不錯的樣子,它們的定義方法如下

{
  "kind": "flyoutToolbox",
  "contents": [
    {
      "kind": "block",
      "type": "logic_boolean"
    },
    {
      "kind": "block",
      "type": "math_number",
      "fields": {
        "NUM": 42
      }
    },
    {
      "kind": "block",
      "type": "controls_for",
      "inputs": {
        "FROM": {
          "block": {
            "type": "math_number",
            "fields": {
              "NUM": 1
            }
          }
        },
        "TO": {
          "block": {
            "type": "math_number",
            "fields": {
              "NUM": 10
            }
          }
        },
        "BY": {
          "block": {
            "type": "math_number",
            "fields": {
              "NUM": 1
            }
          }
        },
      }
    },
    {
      "kind": "block",
      "type": "math_arithmetic",
      "fields": {
        "OP": "ADD"
      },
      "inputs": {
        "A": {
          "shadow": {
            "type": "math_number",
            "fields": {
              "NUM": 1
            }
          }
        },
        "B": {
          "shadow": {
            "type": "math_number",
            "fields": {
              "NUM": 1
            }
          }
        }
      }
    },
  ]
}

有點頭大。。。。。。才四個簡單的就這么麻煩。

好在還是有稍微簡便的方法的,這些塊都是基礎(chǔ)的塊上修改連接而來的,因此,將這些都在工作區(qū)上做好,然后使用下面這個方法將其描述方法打印到日志上,然后再拷貝出來用

console.log(Blockly.serialization.workspaces.save(Blockly.mainWorkspace));

最后想說,真的好多內(nèi)容啊,留了好多坑,但是最大的坑還是,JSON定義里那些kind、type的值哪里來的????????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容