Überlegen Sie vor dem Erstellen eines neuen Feldtyps, ob einer der anderen Methoden zum Anpassen von Feldern. Wenn Ihre Anwendung ein Werttyp ändern oder eine neue Benutzeroberfläche für einen vorhandenen Werttyp erstellen möchten, müssen Sie wahrscheinlich einen neuen Feldtyp erstellen.
So erstellen Sie ein neues Feld:
- Implementieren Sie einen Konstruktor.
- JSON-Schlüssel registrieren und
fromJson
implementieren - Initialisieren der On-Block-UI und des -Ereignisses verarbeiten Hörer.
- Behebung von Ereignis-Listenern (die Benutzeroberfläche wird für du.
- Wertverarbeitung implementieren:
- Fügen Sie der Barrierefreiheit eine Textdarstellung des Feldwerts hinzu.
- Fügen Sie zusätzliche Funktionen hinzu, z. B.: <ph type="x-smartling-placeholder">
- Konfigurieren Sie zusätzliche Aspekte Ihres Fachgebiets, z. B.: <ph type="x-smartling-placeholder">
In diesem Abschnitt wird vorausgesetzt, dass Sie den Inhalt der Aufbau eines Feld:
Ein Beispiel für ein benutzerdefiniertes Feld finden Sie unter Benutzerdefinierte Felder Demo .
Konstruktor implementieren
Der Konstruktor des Felds ist für die Einrichtung des Anfangswerts des Felds verantwortlich und optional eine lokale Validator. Der benutzerdefinierte Der Konstruktor des Feldes wird während der Initialisierung des Quellblocks aufgerufen, unabhängig davon, ob der Quellblock in JSON oder JavaScript definiert ist. Die benutzerdefinierte hat während der Erstellung keinen Zugriff auf den Quellblock.
Im folgenden Codebeispiel wird ein benutzerdefiniertes Feld mit dem Namen GenericField
erstellt:
class GenericField extends Blockly.Field {
constructor(value, validator) {
super(value, validator);
this.SERIALIZABLE = true;
}
}
Methodensignatur
Feldkonstruktoren nehmen normalerweise einen Wert und eine lokale Validierung an. Der Wert ist
optional und wenn Sie keinen Wert übergeben (oder ein Wert übergeben wird, bei dem die Klasse nicht erfolgreich ist)
Validierung), wird der Standardwert der Basisklasse verwendet. Für die
Field
-Standardklasse, dieser Wert ist null
. Wenn Sie diese Standardeinstellung nicht
Wert ist, achten Sie darauf, einen geeigneten Wert zu übergeben. Der Parameter „validator“ ist nur
für bearbeitbare Felder vorhanden und in der Regel als optional gekennzeichnet. Weitere Informationen
Validierungen
Dokumentation.
Struktur
Die Logik in Ihrem Konstruktor sollte diesem Ablauf folgen:
- Rufen Sie den übernommenen Superkonstruktor auf (alle benutzerdefinierten Felder sollten von
Blockly.Field
oder einer seiner abgeleiteten Klassen), um den Wert korrekt zu initialisieren und legen Sie die lokale Validierung für Ihr Feld fest. - Wenn Ihr Feld serialisierbar ist, legen Sie die entsprechende Eigenschaft in der -Konstruktor. Bearbeitbare Felder müssen serialisierbar und bearbeitbar sein Daher sollten Sie diese Eigenschaft wahrscheinlich auf "true" setzen, es sei denn, Sie wissen nicht serialisierbar.
- Optional: Nehmen Sie weitere Anpassungen vor, z. B. Labelfelder. eine CSS-Klasse übergeben, die dann auf den Text angewendet wird).
JSON und Registrierung
Im JSON-Block
Definitionen,
-Felder werden durch einen String beschrieben (z.B. field_number
, field_textinput
).
Blockly verwaltet eine Zuordnung von diesen Strings zu Feldobjekten und Aufrufen
fromJson
für das entsprechende Objekt während der Konstruktion.
Rufen Sie Blockly.fieldRegistry.register
auf, um dieser Karte Ihren Feldtyp hinzuzufügen.
und übergeben die Feldklasse als zweites Argument:
Blockly.fieldRegistry.register('field_generic', GenericField);
Außerdem müssen Sie die fromJson
-Funktion definieren. Ihre Implementierung sollte
Dereferenzieren Sie zunächst eine beliebige Zeichenfolge
Tabelle
Referenzen mit
replaceMessageReferences,
und dann die Werte an den Konstruktor übergeben.
GenericField.fromJson = function(options) {
const value = Blockly.utils.parsing.replaceMessageReferences(
options['value']);
return new CustomFields.GenericField(value);
};
Wird initialisiert
Wenn Ihr Feld erstellt wird, enthält es im Grunde nur einen Wert. Bei der Initialisierung wird das DOM und das Modell erstellt (wenn das Feld besitzt ein Modell) und Ereignisse sind gebunden.
On-Block-Display
Während der Initialisierung sind Sie dafür verantwortlich, alles zu erstellen, was Sie benötigen für die Blockanzeige des Feldes.
Standardeinstellungen, Hintergrund und Text
Die Standardfunktion initView
erstellt ein helles rect
-Element und ein
text
-Element. Wenn Ihr Feld sowohl beides als auch zusätzliche
rufen Sie die Funktion initView
auf, bevor Sie den Rest der
DOM-Elemente. Wenn Sie möchten, dass Ihr Feld eine, aber nicht beides
Elemente, die Sie mit der Funktion createBorderRect_
oder createTextElement_
verwenden können.
DOM-Konstruktion anpassen
Wenn Ihr Feld ein generisches Textfeld ist (z.B. Text
Input)
Die DOM-Erstellung wird für Sie übernommen. Andernfalls müssen Sie die
die initView
-Funktion zum Erstellen der DOM-Elemente, die Sie während
für die zukünftige Darstellung
Ihres Felds.
Ein Dropdown-Feld kann beispielsweise sowohl Bilder als auch Text enthalten. In initView
ein einzelnes Bildelement und ein einzelnes Textelement. Danach: render_
wird das aktive Element angezeigt und das andere ausgeblendet, je nachdem,
ausgewählte Option.
DOM-Elemente können entweder über die
Blockly.utils.dom.createSvgElement
-Methode oder über die herkömmliche DOM-Erstellung
.
Für die Anzeige auf einem Feld gelten folgende Anforderungen:
- Alle DOM-Elemente müssen untergeordnete Elemente von
fieldGroup_
des Felds sein. Das Feld wird automatisch erstellt. - Alle DOM-Elemente müssen innerhalb der angegebenen Dimensionen des Felds bleiben.
Weitere Informationen finden Sie in der Rendering .
Textsymbole hinzufügen
Wenn Sie dem Text eines Feldes Symbole hinzufügen möchten, z. B. das
Winkel
Grad-Symbols), können Sie das Symbolelement (normalerweise in einem
<tspan>
) direkt in die textElement_
des Felds.
Eingabe-Ereignisse
Standardmäßig werden in den Feldern Kurzinfo-Ereignisse und Mousedown-Ereignisse (zur Verwendung für
wird angezeigt
Mitbearbeiter.
Wenn Sie andere Arten von Ereignissen überwachen möchten (z.B. um
durch Ziehen eines Felds), sollten Sie die bindEvents_
-Funktion des Felds überschreiben.
bindEvents_() {
// Call the superclass function to preserve the default behavior as well.
super.bindEvents_();
// Then register your own additional event listeners.
this.mouseDownWrapper_ =
Blockly.browserEvents.conditionalBind(this.getClickTarget_(), 'mousedown', this,
function(event) {
this.originalMouseX_ = event.clientX;
this.isMouseDown_ = true;
this.originalValue_ = this.getValue();
event.stopPropagation();
}
);
this.mouseMoveWrapper_ =
Blockly.browserEvents.conditionalBind(document, 'mousemove', this,
function(event) {
if (!this.isMouseDown_) {
return;
}
var delta = event.clientX - this.originalMouseX_;
this.setValue(this.originalValue_ + delta);
}
);
this.mouseUpWrapper_ =
Blockly.browserEvents.conditionalBind(document, 'mouseup', this,
function(_event) {
this.isMouseDown_ = false;
}
);
}
Zur Bindung an ein Ereignis sollten Sie im Allgemeinen die Methode
Blockly.utils.browserEvents.conditionalBind
. Diese Methode von Bindungsereignissen filtert sekundäre Berührungen während
Drags. Wenn der Handler auch mitten in einem Drag-Vorgang ausgeführt werden soll,
können Sie den
Blockly.browserEvents.bind
.
Entsorgung
Wenn Sie benutzerdefinierte Ereignis-Listener innerhalb des Felds bindEvents_
registriert haben
müssen sie nicht in der dispose
-Funktion registriert werden.
Wenn Sie die
ansehen
des Feldes (durch Anfügen aller DOM-Elemente an fieldGroup_
) und der Wert
wird das DOM des Felds automatisch entfernt.
Umgang mit Werten
→ Informationen zum Wert eines Feldes im Vergleich zu seinem Text finden Sie unter Aufbau eines Feldes Feld ein.
Validierungsreihenfolge
Klassenvalidierung implementieren
Felder dürfen nur bestimmte Werte akzeptieren. Zahlenfelder sollten beispielsweise nur können nur Zahlen akzeptiert werden. Für Farbfelder sind nur Farben usw. zulässig. über Kurs- und lokale Kampagnen Validatoren. Die Klasse Für die Validierung gelten dieselben Regeln wie für lokale Validierungen, mit der Ausnahme, dass sie auch ausgeführt wird. in der Konstruktor Daher sollte er nicht auf den Quellblock verweisen.
Überschreibe doClassValidation_
, um die Klassenvalidierung deines Felds zu implementieren
.
doClassValidation_(newValue) {
if (typeof newValue != 'string') {
return null;
}
return newValue;
};
Gültige Werte verarbeiten
Wenn der Wert, der an ein Feld mit setValue
übergeben wurde, gültig ist, erhalten Sie eine
doValueUpdate_
-Rückruf. Standardmäßig gilt für die Funktion doValueUpdate_
Folgendes:
- Legt das Attribut
value_
aufnewValue
fest. - Legt den
isDirty_
fest. zutrue
.
Wenn Sie den Wert nur speichern
und keine benutzerdefinierte Verarbeitung vornehmen möchten,
müssen Sie doValueUpdate_
nicht überschreiben.
Andernfalls können Sie Folgendes tun:
- Benutzerdefinierter Speicher von
newValue
. - Andere Eigenschaften basierend auf
newValue
ändern. - Speichert, ob der aktuelle Wert gültig ist oder nicht.
Sie müssen doValueUpdate_
überschreiben:
doValueUpdate_(newValue) {
super.doValueUpdate_(newValue);
this.displayValue_ = newValue;
this.isValueValid_ = true;
}
Umgang mit ungültigen Werten
Wenn der mit setValue
übergebene Wert ungültig ist, erhalten Sie eine
doValueInvalid_
-Rückruf. Standardmäßig führt die Funktion doValueInvalid_
nichts. Das bedeutet, dass ungültige Werte standardmäßig nicht angezeigt werden. Außerdem
wird das Feld nicht erneut gerendert,
isDirty_
wird nicht festgelegt.
Wenn ungültige Werte angezeigt werden sollen, müssen Sie doValueInvalid_
überschreiben.
In den meisten Fällen solltest du eine displayValue_
-Eigenschaft auf die
ungültiger Wert, festgelegt
isDirty_
bis true
und überschreiben
render_
damit das Display auf dem Sperrbildschirm basierend auf displayValue_
und nicht anhand des
value_
doValueInvalid_(newValue) {
this.displayValue_ = newValue;
this.isDirty_ = true;
this.isValueValid_ = false;
}
Mehrteilige Werte
Wenn das Feld einen mehrteiligen Wert enthält (z.B. Listen, Vektoren, Objekte), möchten, dass die Teile wie einzelne Werte behandelt werden.
doClassValidation_(newValue) {
if (FieldTurtle.PATTERNS.indexOf(newValue.pattern) == -1) {
newValue.pattern = null;
}
if (FieldTurtle.HATS.indexOf(newValue.hat) == -1) {
newValue.hat = null;
}
if (FieldTurtle.NAMES.indexOf(newValue.turtleName) == -1) {
newValue.turtleName = null;
}
if (!newValue.pattern || !newValue.hat || !newValue.turtleName) {
this.cachedValidatedValue_ = newValue;
return null;
}
return newValue;
}
Im obigen Beispiel wird jedes Attribut von newValue
einzeln validiert. Dann
am Ende der doClassValidation_
-Funktion, wenn ein einzelnes Attribut
ungültig ist, wird der Wert vor dem Speichern in der Property cacheValidatedValue_
im Cache gespeichert.
Rückgabe von null
(ungültig). Caching des Objekts mit einzeln validierten
Eigenschaften
doValueInvalid_
um sie separat zu verarbeiten, indem Sie einfach eine
!this.cacheValidatedValue_.property
-Prüfung, anstatt jede einzelne neu zu validieren
für jede einzelne Property.
Dieses Muster zur Validierung mehrteiliger Werte kann auch in lokalen Validatoren, aber Derzeit gibt es keine Möglichkeit, dieses Muster zu erzwingen.
isDirty_
isDirty_
ist ein Flag, das im
setValue
und andere Teile des Feldes, um festzustellen, ob das Feld
das erneut gerendert wurde. Wenn sich der Anzeigewert des Felds geändert hat, sollte isDirty_
normalerweise
auf true
festgelegt werden.
Text
→ Informationen dazu, wo der Text eines Felds verwendet wird und wie er sich unterscheidet aus dem Feldwert siehe Aufbau eines Feld ein.
Weicht der Text des Feldes vom Wert des Feldes ab, sollten Sie
überschreiben
getText
-Funktion
um den richtigen Text bereitzustellen.
getText() {
let text = this.value_.turtleName + ' wearing a ' + this.value_.hat;
if (this.value_.hat == 'Stovepipe' || this.value_.hat == 'Propeller') {
text += ' hat';
}
return text;
}
Editor erstellen
Wenn Sie die Funktion showEditor_
definieren, wartet Blockly automatisch auf
klicken und zur richtigen Zeit showEditor_
anrufen. Sie können jeden beliebigen HTML-Code anzeigen lassen.
in Ihrem Editor, indem Sie eine von zwei speziellen div-Tags
einschließen, dem DropDownDiv-Element.
und WidgetDiv, die über dem Rest der Blockly-Benutzeroberfläche schweben.
DropDownDiv vs. WidgetDiv
Die DropDownDiv
wird verwendet, um Mitbearbeitern bereitzustellen, die sich in einer Box befinden, die verbunden ist
in ein Feld ein. Das Gerät positioniert sich automatisch so, dass es in der Nähe des Spielfelds ist, ohne den Anschluss zu verändern.
innerhalb der sichtbaren Grenzen. Die Winkelauswahl und die Farbauswahl sind gute Beispiele für
DropDownDiv
.
Der WidgetDiv
wird für Folgendes verwendet:
Editoren bereitstellen, die nicht in einem Paket enthalten sind. In Zahlenfeldern wird die
WidgetDiv zur Abdeckung des Feldes mit einem HTML-Texteingabefeld. Während die DropDownDiv-
die Positionierung für Sie übernimmt, WidgetDiv nicht. Elemente müssen
manuell positioniert werden. Das Koordinatensystem wird in Pixelkoordinaten bezogen auf
oben links im Fenster. Der Texteingabeeditor ist ein gutes Beispiel für
WidgetDiv
DropDownDiv-Beispielcode
showEditor_() {
// Create the widget HTML
this.editor_ = this.dropdownCreate_();
Blockly.DropDownDiv.getContentDiv().appendChild(this.editor_);
// Set the dropdown's background colour.
// This can be used to make it match the colour of the field.
Blockly.DropDownDiv.setColour('white', 'silver');
// Show it next to the field. Always pass a dispose function.
Blockly.DropDownDiv.showPositionedByField(
this, this.disposeWidget_.bind(this));
}
WidgetDiv-Beispielcode
showEditor_() {
// Show the div. This automatically closes the dropdown if it is open.
// Always pass a dispose function.
Blockly.WidgetDiv.show(
this, this.sourceBlock_.RTL, this.widgetDispose_.bind(this));
// Create the widget HTML.
var widget = this.createWidget_();
Blockly.WidgetDiv.getDiv().appendChild(widget);
}
Bereinigen
Sowohl DropDownDiv als auch WidgetDiv-Handle zerstören den Widget-HTML-Code -Elemente. Alle vorhandenen Ereignis-Listener müssen jedoch manuell entfernt werden. auf diese Elemente angewendet.
widgetDispose_() {
for (let i = this.editorListeners_.length, listener;
listener = this.editorListeners_[i]; i--) {
Blockly.browserEvents.unbind(listener);
this.editorListeners_.pop();
}
}
Die Funktion dispose
wird in einem null
-Kontext auf der DropDownDiv
aufgerufen. An
Das WidgetDiv
, das im Kontext von WidgetDiv
aufgerufen wird. In beiden Fällen
verwenden Sie am besten das
binden
, wenn Sie eine Löschfunktion übergeben, wie in der obigen DropDownDiv
gezeigt.
und WidgetDiv
Beispiele.
→ Informationen zur Entsorgung, die sich nicht speziell auf die Entsorgung von Redakteuren beziehen, finden Sie unter Entsorgung:
On-Block-Display aktualisieren
Mit der Funktion render_
wird die Blockanzeige des Felds entsprechend aktualisiert.
seinen internen Wert.
Beispiele:
- Text ändern (Dropdown-Menü)
- Farbe (Farbe) ändern
Standardeinstellungen
Mit der Standardfunktion render_
wird als Anzeigetext das Ergebnis des
getDisplayText_
. Die Funktion getDisplayText_
gibt das Attribut value_
des Felds zurück
Umwandlung in eine Zeichenfolge, nachdem sie abgeschnitten wurde, um den maximalen Text zu berücksichtigen
Länge.
Wenn Sie das standardmäßige On-Block-Display und das Standardtextverhalten
für Ihr Feld funktioniert, müssen Sie render_
nicht überschreiben.
Wenn das Standardtextverhalten für Ihr Feld funktioniert, es aber
zusätzliche statische Elemente enthält, können Sie den Standardwert render_
Sie müssen sie jedoch trotzdem überschreiben, um den Wert des Felds zu aktualisieren.
Größe.
Wenn das Standardtextverhalten für Ihr Feld nicht funktioniert oder die
die On-Block-Display-Anzeige zusätzliche dynamische Elemente enthält, müssen Sie die
die render_
Funktion.
Rendering anpassen
Wenn das Standardrenderingverhalten für Ihr Feld nicht funktioniert, müssen Sie das benutzerdefinierte Rendering-Verhalten zu definieren. Dies kann alles umfassen, vom Festlegen benutzerdefinierter Anzeigetext, zum Ändern von Bildelementen und zum Aktualisieren der Hintergrundfarben.
Alle DOM-Attributänderungen sind zulässig. Die einzigen beiden Dinge, die Sie beachten sollten, sind:
- Die DOM-Erstellung sollte während der Initialisierung, weil es effizienter ist.
- Du solltest immer die
size_
aktualisieren. an die Größe des Bildschirms angepasst.
render_() {
switch(this.value_.hat) {
case 'Stovepipe':
this.stovepipe_.style.display = '';
break;
case 'Crown':
this.crown_.style.display = '';
break;
case 'Mask':
this.mask_.style.display = '';
break;
case 'Propeller':
this.propeller_.style.display = '';
break;
case 'Fedora':
this.fedora_.style.display = '';
break;
}
switch(this.value_.pattern) {
case 'Dots':
this.shellPattern_.setAttribute('fill', 'url(#polkadots)');
break;
case 'Stripes':
this.shellPattern_.setAttribute('fill', 'url(#stripes)');
break;
case 'Hexagons':
this.shellPattern_.setAttribute('fill', 'url(#hexagons)');
break;
}
this.textContent_.nodeValue = this.value_.turtleName;
this.updateSize_();
}
Größe wird aktualisiert
Die Aktualisierung der Eigenschaft size_
eines Felds ist sehr wichtig, da sie den
wie das Feld positioniert werden soll. Der beste Weg, um herauszufinden,
wie diese size_
aussehen sollte, indem Sie experimentieren.
updateSize_() {
const bbox = this.movableGroup_.getBBox();
let width = bbox.width;
let height = bbox.height;
if (this.borderRect_) {
width += this.constants_.FIELD_BORDER_RECT_X_PADDING * 2;
height += this.constants_.FIELD_BORDER_RECT_X_PADDING * 2;
this.borderRect_.setAttribute('width', width);
this.borderRect_.setAttribute('height', height);
}
// Note how both the width and the height can be dynamic.
this.size_.width = width;
this.size_.height = height;
}
Übereinstimmende Blockfarben
Wenn Elemente Ihres Feldes den Farben des Blocks entsprechen sollen,
verknüpft ist, sollten Sie die Methode applyColour
überschreiben. Sie sollten
greifen Sie über die Stileigenschaft des Blocks auf die Farbe zu.
applyColour() {
const sourceBlock = this.sourceBlock_;
if (sourceBlock.isShadow()) {
this.arrow_.style.fill = sourceBlock.style.colourSecondary;
} else {
this.arrow_.style.fill = sourceBlock.style.colourPrimary;
}
}
Bearbeitbarkeit wird aktualisiert
Mit der Funktion updateEditable
können Sie die Darstellung Ihres Felds ändern
je nachdem, ob sie
bearbeitbar sind oder nicht. Die Standardfunktion sorgt dafür, dass der
Im Hintergrund wird über den Mauszeiger (Rahmen) angezeigt bzw. nicht angezeigt, wenn er bearbeitet werden kann bzw. nicht bearbeitet werden kann.
Die Größe des On-Block-Displays sollte sich nicht je nach Bearbeitungsfähigkeit ändern, aber
Alle anderen Änderungen sind zulässig.
updateEditable() {
if (!this.fieldGroup_) {
// Not initialized yet.
return;
}
super.updateEditable();
const group = this.getClickTarget_();
if (!this.isCurrentlyEditable()) {
group.style.cursor = 'not-allowed';
} else {
group.style.cursor = this.CURSOR;
}
}
Serialisierung
Bei der Serialisierung geht es darum, Status des Felds, damit es später wieder in den Arbeitsbereich geladen werden kann.
Der Status des Arbeitsbereichs enthält immer den Wert des Felds, er kann aber auch weitere Status enthalten, z. B. den Status der Benutzeroberfläche Ihres Felds. Wenn zum Beispiel eine zoombare Karte war, mit der Nutzer Länder auswählen konnten, auch die Zoomstufe serialisieren.
Wenn das Feld serialisierbar ist, musst du das Attribut SERIALIZABLE
auf
true
.
Blockly bietet zwei Sätze von Serialisierungs-Hooks für Felder. Ein Paar Haken funktioniert mit dem neuen JSON-Serialisierungssystem, während das andere Paar mit dem ein altes XML-Serialisierungssystem.
saveState
und loadState
saveState
und loadState
sind Serialisierungs-Hooks, die mit dem neuen JSON-Format kompatibel sind
Serialisierungssystem vor.
In einigen Fällen müssen Sie diese nicht angeben, da die Standardeinstellungen
Implementierungen funktionieren. Wenn (1) Ihr Feld eine direkte abgeleitete Klasse der Basisklasse ist,
Blockly.Field
-Klasse, (2) Ihr Wert ist eine serialisierbare JSON-Datei.
eingeben und (3) Sie müssen nur
serialisieren Sie den Wert, dann funktioniert die Standardimplementierung gut.
Andernfalls sollte die Funktion saveState
eine serialisierbare JSON-Datei zurückgeben.
Objekt/Wert, der den Status des Felds darstellt. Und dein loadState
-Funktion sollte dasselbe serialisierbare JSON-Objekt bzw. denselben JSON-serialisierbaren Wert akzeptieren und denselben
auf dem Feld.
saveState() {
return {
'country': this.getValue(), // Value state
'zoom': this.getZoomLevel(), // UI state
};
}
loadState(state) {
this.setValue(state['country']);
this.setZoomLevel(state['zoom']);
}
Vollständige Serialisierung und Sicherungsdaten
saveState
empfängt auch den optionalen Parameter doFullSerialization
. Dies ist
von Feldern verwendet werden, die normalerweise auf den Zustand verweisen, der von einem anderen
Serializer (wie unterstützende Datenmodelle). Der Parameter signalisiert,
Der referenzierte Zustand ist nicht verfügbar, wenn der Block deserialisiert wird, sodass der
sollte die gesamte Serialisierung selbst übernehmen. Dies trifft beispielsweise zu, wenn
ein einzelner Block serialisiert
oder wenn ein Block kopiert und eingefügt wird.
Zwei häufige Anwendungsfälle hierfür sind:
- Wenn ein einzelner Block in einen Arbeitsbereich geladen wird, in dem die unterstützenden Daten nicht vorhanden ist, verfügt das Feld über genügend Informationen im eigenen Status, um um ein neues Datenmodell zu erstellen.
- Wenn ein Block kopiert und eingefügt wird, erstellt das Feld immer eine neue Sicherung Datenmodell zu verwenden, anstatt auf ein vorhandenes Modell zu verweisen.
Ein Feld, in dem dies verwendet wird, ist das integrierte Variablenfeld. Normalerweise serialisiert sie
Die ID der Variablen, auf die sie verweist, aber wenn doFullSerialization
wahr ist
alle Status serialisiert.
saveState(doFullSerialization) {
const state = {'id': this.variable_.getId()};
if (doFullSerialization) {
state['name'] = this.variable_.name;
state['type'] = this.variable_.type;
}
return state;
}
loadState(state) {
const variable = Blockly.Variables.getOrCreateVariablePackage(
this.getSourceBlock().workspace,
state['id'],
state['name'], // May not exist.
state['type']); // May not exist.
this.setValue(variable.getId());
}
Das Variablenfeld sorgt dafür, dass beim Laden in einen Arbeitsbereich wo seine Variable nicht vorhanden ist, kann sie eine neue Variable erstellen, auf die verwiesen werden kann.
toXml
und fromXml
toXml
und fromXml
sind Serialisierungs-Hooks, die mit der alten XML-Datei funktionieren
Serialisierungssystem vor. Verwenden Sie diese Aufhänger nur, wenn es nötig ist (z.B. wenn Sie
auf einer alten Codebasis, die noch nicht migriert wurde). Andernfalls verwenden Sie saveState
und
loadState
.
Die Funktion toXml
sollte einen XML-Knoten zurückgeben, der den Status
auf dem Feld. Die Funktion fromXml
sollte denselben XML-Knoten akzeptieren und
in das Feld ein.
toXml(fieldElement) {
fieldElement.textContent = this.getValue();
fieldElement.setAttribute('zoom', this.getZoomLevel());
return fieldElement;
}
fromXml(fieldElement) {
this.setValue(fieldElement.textContent);
this.setZoomLevel(fieldElement.getAttribute('zoom'));
}
Bearbeitbare und serialisierbare Eigenschaften
Das Attribut EDITABLE
bestimmt, ob das Feld über eine Benutzeroberfläche verfügen soll, um anzugeben, dass
mit dem es interagieren kann. Der Standardwert ist true
.
Das Attribut SERIALIZABLE
bestimmt, ob das Feld serialisiert werden soll. Es
ist standardmäßig false
. Wenn diese Property true
ist, müssen Sie möglicherweise angeben,
Serialisierungs- und Deserialisierungsfunktionen (siehe
Serialisierung).
Cursor anpassen
Das Attribut CURSOR
bestimmt den Cursor, den Nutzer sehen, wenn sie den Mauszeiger auf
in Ihrem Bereich. Er sollte ein gültiger CSS-Cursorstring sein. Standardmäßig wird der Cursor
definiert durch .blocklyDraggable
, d. h. den Greif-Cursor.