Anatomia di un blocco

Questo documento esplora le diverse parti di un blocco.

Connessioni

Le connessioni definiscono dove possono connettersi i blocchi e a quali tipi di blocchi possono connettersi.

Esistono quattro tipi di connessioni:

Tipo di connessione Immagine
Connessione di output una connessione di output
Connessione di ingresso una connessione di input
Connessione precedente una connessione precedente
Prossima coincidenza una prossima connessione

Le connessioni di output e di input possono essere collegate tra loro, così come le connessioni successive e precedenti. Puoi limitare ulteriormente le connessioni con i controlli della connessione.

Puoi personalizzare le forme delle connessioni utilizzando un renderer personalizzato.

Connessioni di primo livello

I blocchi hanno tre connessioni il cui utilizzo è facoltativo.

Un blocco può avere una singola connessione di output, rappresentata come un connettore a incastro maschio sul bordo anteriore di un blocco. Una connessione di output passa il valore (espressione) di un blocco a un altro blocco. Un blocco con una connessione di output è chiamato blocco di valori.

Un blocco math_number.

Un blocco può avere una connessione precedente nella parte superiore (rappresentata da una tacca) e una connessione successiva nella parte inferiore (rappresentata da una scheda). Questi consentono di impilare i blocchi verticalmente, rappresentando una sequenza di istruzioni. Un blocco senza una connessione di output è chiamato blocco istruzione e di solito ha connessioni precedenti e successive.

Un blocco variables_set.

Per saperne di più, vedi Connessioni di primo livello.

Campi

I campi definiscono la maggior parte degli elementi della UI all'interno di un blocco. Questi includono etichette stringa, menu a discesa, caselle di controllo, immagini e input per dati letterali come stringhe e numeri. Ad esempio, questo blocco loop utilizza campi etichetta, un campo a discesa e campi numerici.

Un blocco con più campi.

Blockly fornisce una serie di campi integrati, tra cui input di testo, selettori di colore e immagini. Puoi anche creare i tuoi campi.

Per ulteriori informazioni, vedi Campi.

Input

Gli input sono container per campi e connessioni. Un blocco viene creato visualizzando i relativi input in una o più righe come mattoni.

Esistono quattro diversi tipi di input, tutti possono contenere campi (incluse le etichette) e due contengono una singola connessione. Puoi anche creare input personalizzati, che supportano il rendering personalizzato.

Tipo di input Tipo di connessione Immagine
Input fittizio Nessuno dummy input
Input di fine riga Nessuno input di fine riga
Input del valore Connessione di ingresso input del valore
Input dell'estratto conto Prossima coincidenza input della dichiarazione

Introdurremo questi input attraverso una serie di esempi. Per informazioni sulla definizione degli input, delle connessioni e dei campi che compongono un blocco, consulta Struttura del blocco in JSON e Struttura del blocco in JavaScript.

Input fittizi

Un input fittizio è solo un contenitore per i campi, non ha una connessione. Ad esempio, il seguente blocco numerico ha un singolo input fittizio che contiene un singolo campo numerico.

Un blocco numerico con un input fittizio e un campo numerico.

Come esempio più complesso, considera un blocco che somma due numeri. Questo può essere creato da un singolo input fittizio con tre campi (numero, etichetta, numero):

Un blocco di addizione creato da un input fittizio con tre
campi.

o tre input fittizi, ciascuno con un solo campo:

Un blocco di addizione creato da tre input fittizi, ciascuno con un singolo
campo.

Input di fine riga

Blockly utilizza l'euristica per decidere se eseguire il rendering di tutti gli input in una singola riga o di ogni input nella propria riga. Se vuoi assicurarti che un input inizi una nuova riga, utilizza un input di fine riga come input precedente.

Come gli input fittizi, gli input di fine riga possono contenere campi, ma non hanno una connessione. Ad esempio, ecco il blocco di aggiunta creato da un input di fine riga con due campi e un input fittizio con un campo. L'input di fine riga forza il rendering dell'input fittizio in una nuova riga.

Un blocco di addizione suddiviso in due righe da un input di fine riga.

Input dei valori

I campi hanno limiti di accettazione. Ad esempio, i campi numerici accettano solo numeri. Ma cosa succede se vuoi sommare due variabili? Oppure aggiungere il risultato di una chiamata di procedura al risultato di un calcolo diverso? Per risolvere questo problema, utilizza le connessioni di input anziché i campi. In questo modo gli utenti possono utilizzare i blocchi di valori come valori di input.

Un input di valore contiene zero o più campi e termina con una connessione di input. Il seguente blocco sostituisce i campi numerici nel blocco di addizione con connessioni di input. È composto da due input di valori: il primo non contiene campi e il secondo contiene un campo etichetta. Entrambi terminano con connessioni di ingresso.

Un blocco di addizione con due input di valori.

Input dell'estratto conto

L'ultimo tipo di input è un input di istruzione, che contiene zero o più campi e termina con una connessione successiva. La connessione successiva ti consente di nidificare una pila di blocchi di istruzioni all'interno del blocco. Ad esempio, considera il seguente blocco di ripetizione. La seconda riga di questo blocco è costituita da un input di istruzione con un singolo campo etichetta e una connessione successiva.

Un blocco ripetuto con un input di istruzione per nidificare istruzioni ripetute.

Gli input dell'istruzione vengono sempre visualizzati nella propria riga. Puoi vederlo nel seguente blocco if-then-else, che ha un input di valore nella prima riga e input di istruzione nelle due righe successive.

Un blocco if-then-else con input di istruzioni separati per le istruzioni then ed else.

Input in linea e input esterni

Gli input possono essere visualizzati in linea o esternamente. Questo controllo determina se i connettori per gli input dei valori vengono visualizzati all'interno del blocco (in linea) o sul bordo esterno (esterno), nonché se gli input vengono visualizzati nella stessa riga o in righe diverse.

Lo stesso blocco viene visualizzato una volta con input incorporati e una volta con input esterni.

Quando crei un blocco personalizzato, puoi specificare quale utilizzare o lasciare che Blockly decida per te. Per saperne di più, consulta Input incorporati ed esterni.

Vai a giocare!

Il modo migliore per scoprire di più su input, campi e connessioni è creare blocchi in Blockly Developer Tools e scegliere impostazioni diverse per il menu a discesa inputs (automatic, external, inline).

Icone

Oltre a input, connessioni e campi, i blocchi possono avere una o più icone. Questi hanno una serie di utilizzi, ad esempio la visualizzazione di avvisi, l'inserimento di commenti a livello di blocco o la visualizzazione dell'interfaccia utente di modifica. Ad esempio, ecco un blocco con un'icona di commento e il relativo editor.

Un blocco con un'icona di commento e un editor di commenti aperto.

Per ulteriori informazioni, consulta la sezione Icons.

Blocchi e oggetti JavaScript

Blocchi, input, connessioni, campi e icone sono tutti oggetti JavaScript.

Componente Blockly Classe base Sottoclassi
Blocca Block BlockSvg
Input Input DummyInput
EndRowInput
ValueInput
StatementInput
input personalizzato
Connessione Connection RenderedConnection
Campo Field FieldTextInput
FieldNumber
FieldLabel
campo personalizzato
e così via
Icona Icon CommentIcon
MutatorIcon
WarningIcon
icona personalizzata

Gli oggetti in un blocco formano un oggetto a forma di albero. Comprendere in che modo la rappresentazione grafica di un blocco corrisponde a questo albero è utile quando scrivi codice per manipolare i blocchi in modo programmatico. Ad esempio, un blocco controls_for:

Un blocco ciclo con un campo variabile, input di valori per a, da e per e un input di istruzione per istruzioni ripetute.

corrisponde al seguente albero di oggetti JavaScript.

// <Object> means an instance of an Object.
{                                   // Block
  nextConnection: <Connection>,     // ConnectionType NEXT_STATEMENT
  outputConnection: null,
  previousConnection: <Connection>, // ConnectionType PREVIOUS_STATEMENT
  inputList: [                      // Array of Inputs in block
    {                               // ValueInput
      connection: <Connection>,     // ConnectionType INPUT_VALUE
      fieldRow: [                   // Array of fields in Input
        <FieldLabel>,               // 'count with'
        <FieldVariable>,            // i
        <FieldLabel>,               // 'from'
      ],
    },
    {                               // ValueInput
      connection: <Connection>,     // ConnectionType INPUT_VALUE
      fieldRow: [
        <FieldLabel>,               // 'to'
      ],
    },
    {                               // ValueInput
      connection: <Connection>,     // ConnectionType INPUT_VALUE
      fieldRow: [
        <FieldLabel>,               // 'by'
      ],
    },
    {                               // StatementInput
      connection: <Connection>,     // ConnectionType NEXT_STATEMENT
      fieldRow: [
        <FieldLabel>,               // 'do'
      ],
    },
  ]
}