Yeni bir alan türü oluşturmadan önce, alanları özelleştirmek için diğer yöntemlerden birinin ihtiyaçlarınıza uygun olup olmadığını değerlendirin. Uygulamanızın yeni bir değer türü depolaması gerekiyorsa veya mevcut bir değer türü için yeni bir kullanıcı arayüzü oluşturmak istiyorsanız muhtemelen yeni bir alan türü oluşturmanız gerekir.
Yeni bir alan oluşturmak için aşağıdakileri yapın:
- Oluşturucu uygulayın.
- JSON anahtarı kaydedin ve
fromJson
uygulayın. - Engelleme sırasında kullanıcı arayüzünün ve etkinlik dinleyicilerinin başlatılmasını yönetin.
- Etkinlik işleyicilerinin kaldırılmasını yönetin (Kullanıcı arayüzü kaldırma işlemi sizin için yapılır).
- Değer işlemeyi uygulama.
- Erişilebilirlik için alanınızın değerinin metinle gösterimini ekleyin.
- Aşağıdakiler gibi ek işlevler ekleyin:
- Alanınızın ek özelliklerini yapılandırın. Örneğin:
Bu bölümde, Alan Anatomisi başlıklı makalenin içeriğini okuduğunuz ve bu içerik hakkında bilgi sahibi olduğunuz varsayılmaktadır.
Özel alan örneği için Özel Alanlar demosuna bakın .
Oluşturucu uygulama
Alan oluşturucu, alanın başlangıç değerini ayarlamaktan ve isteğe bağlı olarak yerel doğrulayıcı ayarlamaktan sorumludur. Özel alanın oluşturucusu, kaynak bloğun JSON veya JavaScript'te tanımlanıp tanımlanmadığına bakılmaksızın kaynak bloğun başlatılması sırasında çağrılır. Bu nedenle, özel alan oluşturma sırasında kaynak bloğa erişemez.
Aşağıdaki kod örneği, GenericField
adlı bir özel alan oluşturur:
class GenericField extends Blockly.Field {
constructor(value, validator) {
super(value, validator);
this.SERIALIZABLE = true;
}
}
Yöntem imzası
Alan oluşturucular genellikle bir değer ve yerel bir doğrulayıcı alır. Değer isteğe bağlıdır ve bir değer iletmezseniz (veya sınıf doğrulamasında başarısız olan bir değer iletirseniz) üst sınıfın varsayılan değeri kullanılır. Varsayılan Field
sınıfı için bu değer null
olur. Varsayılan değeri kullanmak istemiyorsanız uygun bir değer ilettiğinizden emin olun. Doğrulayıcı parametresi yalnızca düzenlenebilir alanlar için geçerlidir ve genellikle isteğe bağlı olarak işaretlenir. Doğrulayıcılar dokümanlarında doğrulayıcılar hakkında daha fazla bilgi edinin.
Yapı
Oluşturucunuzdaki mantık şu akışı izlemelidir:
- Değeri düzgün şekilde başlatmak ve alanınız için yerel doğrulayıcıyı ayarlamak üzere devralınan süper oluşturucuyu (tüm özel alanlar
Blockly.Field
veya alt sınıflarından birinden devralınmalıdır) çağırın. - Alanınız serileştirilebiliyorsa oluşturucuda ilgili özelliği ayarlayın. Düzenlenebilir alanlar serileştirilebilir olmalıdır ve alanlar varsayılan olarak düzenlenebilir. Bu nedenle, serileştirilmemesi gerektiğini bilmediğiniz sürece bu özelliği muhtemelen true olarak ayarlamanız gerekir.
- İsteğe bağlı: Ek özelleştirme uygulayın (örneğin, Etiket alanları, bir CSS sınıfının iletilmesine olanak tanır ve bu sınıf daha sonra metne uygulanır).
JSON ve kayıt
JSON bloğu
tanımlarında alanlar
bir dizeyle (ör. field_number
, field_textinput
) açıklanır. Blockly, bu dizelerden alan nesnelerine bir harita oluşturur ve oluşturma sırasında uygun nesnede fromJson
işlevini çağırır.
Alan türünüzü bu haritaya eklemek için Blockly.fieldRegistry.register
işlevini çağırın ve alan sınıfını ikinci bağımsız değişken olarak iletin:
Blockly.fieldRegistry.register('field_generic', GenericField);
Ayrıca fromJson
işlevinizi de tanımlamanız gerekir. Uygulamanızda önce yerelleştirme jetonlarına yapılan referansların referansları replaceMessageReferences kullanılarak kaldırılmalı, ardından değerler oluşturucuya iletilmelidir.
GenericField.fromJson = function(options) {
const value = Blockly.utils.parsing.replaceMessageReferences(
options['value']);
return new CustomFields.GenericField(value);
};
Başlatılıyor
Alanınız oluşturulduğunda temelde yalnızca bir değer içerir. Başlatma, DOM'un oluşturulduğu, modelin oluşturulduğu (alan bir modele sahipse) ve etkinliklerin bağlandığı yerdir.
On-Block ekranı
Başlatma sırasında, alanın blok içi gösterimi için ihtiyacınız olacak her şeyi oluşturmak sizin sorumluluğunuzdadır.
Varsayılanlar, arka plan ve metin
Varsayılan initView
işlevi, açık renkli bir rect
öğesi ve bir text
öğesi oluşturur. Alanınızda bunların ikisinin yanı sıra bazı ek özellikler de olmasını istiyorsanız DOM öğelerinizin geri kalanını eklemeden önce initView
üst sınıf işlevini çağırın. Alanınızda bu öğelerden birinin olmasını, ancak ikisinin de olmamasını istiyorsanız createBorderRect_
veya createTextElement_
işlevlerini kullanabilirsiniz.
DOM oluşturmayı özelleştirme
Alanınız genel bir metin alanıysa (ör. Text
Input),
DOM oluşturma işlemi sizin için gerçekleştirilir. Aksi takdirde, alanınızın gelecekteki oluşturma işlemleri sırasında ihtiyacınız olacak DOM öğelerini oluşturmak için initView
işlevini geçersiz kılmanız gerekir.
Örneğin, bir açılır liste alanı hem resim hem de metin içerebilir. initView
tek bir resim öğesi ve tek bir metin öğesi oluşturur. Ardından, render_
sırasında seçilen seçeneğin türüne göre etkin öğeyi gösterir ve diğerini gizler.
DOM öğeleri oluşturmak için Blockly.utils.dom.createSvgElement
yöntemi veya geleneksel DOM oluşturma yöntemleri kullanılabilir.
Bir alanın blok içi gösteriminin şartları şunlardır:
- Tüm DOM öğeleri, alanın
fieldGroup_
öğesinin alt öğeleri olmalıdır. Alan grubu otomatik olarak oluşturulur. - Tüm DOM öğeleri, alanın bildirilen boyutları içinde kalmalıdır.
Blok içi reklamınızı özelleştirme ve güncelleme hakkında daha fazla bilgi için Oluşturma bölümüne bakın.
Metin sembolleri ekleme
Bir alanın metnine sembol eklemek istiyorsanız (ör. Açı alanının derece sembolü) sembol öğesini (genellikle <tspan>
içinde bulunur) doğrudan alanın textElement_
öğesine ekleyebilirsiniz.
Giriş etkinlikleri
Varsayılan olarak alanlar, ipucu etkinliklerini ve mousedown etkinliklerini (düzenleyicileri göstermek için kullanılır) kaydeder.
Başka tür etkinlikleri dinlemek istiyorsanız (ör. bir alanda sürükleme işlemini işlemek istiyorsanız) alanın bindEvents_
işlevini geçersiz kılmanız gerekir.
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;
}
);
}
Bir etkinliğe bağlamak için genellikle Blockly.utils.browserEvents.conditionalBind
işlevini kullanmanız gerekir. Bu etkinlik bağlama yöntemi, sürükleme sırasında ikincil dokunuşları filtreler. İşleyicinizin devam eden bir sürükleme işleminin ortasında bile çalışmasını istiyorsanız
Blockly.browserEvents.bind
işlevini kullanabilirsiniz.
Bertaraf etme
Alan işlevinin bindEvents_
içinde özel etkinlik dinleyicileri kaydettiyseniz bunların dispose
işlevi içinde kaydının silinmesi gerekir.
Alanınızın görünümünü (tüm DOM öğelerini fieldGroup_
'ye ekleyerek) doğru şekilde başlattıysanız alanın DOM'u otomatik olarak kaldırılır.
Değer işleme
→ Bir alanın değeri ile metni arasındaki fark hakkında bilgi edinmek için Bir alanın yapısı başlıklı makaleyi inceleyin.
Doğrulama sırası
Sınıf doğrulayıcı uygulama
Alanlar yalnızca belirli değerleri kabul etmelidir. Örneğin, sayı alanları yalnızca sayıları, renk alanları yalnızca renkleri kabul etmelidir. Bu, sınıf ve yerel doğrulayıcılar aracılığıyla sağlanır. Sınıf doğrulayıcı, yerel doğrulayıcılarla aynı kuralları uygular. Ancak oluşturucuda da çalıştırıldığından kaynak bloğa referans vermemelidir.
Alanınızın sınıf doğrulayıcısını uygulamak için doClassValidation_
işlevini geçersiz kılın.
doClassValidation_(newValue) {
if (typeof newValue != 'string') {
return null;
}
return newValue;
};
Geçerli değerleri işleme
setValue
içeren bir alana iletilen değer geçerliyse doValueUpdate_
geri araması alırsınız. Varsayılan olarak doValueUpdate_
işlevi:
value_
özelliğininewValue
olarak ayarlar.isDirty_
özelliğinitrue
olarak ayarlar.
Değeri yalnızca saklamanız gerekiyorsa ve özel işlem yapmak istemiyorsanız doValueUpdate_
değerini geçersiz kılmanız gerekmez.
Aksi takdirde, aşağıdaki gibi işlemleri yapmak istiyorsanız:
newValue
için özel depolama alanı.- Diğer özellikleri
newValue
temelinde değiştirin. - Mevcut değerin geçerli olup olmadığını kaydeder.
doValueUpdate_
değerini geçersiz kılmanız gerekir:
doValueUpdate_(newValue) {
super.doValueUpdate_(newValue);
this.displayValue_ = newValue;
this.isValueValid_ = true;
}
Geçersiz değerleri işleme
setValue
ile alana iletilen değer geçersizse doValueInvalid_
geri araması alırsınız. doValueInvalid_
işlevi varsayılan olarak hiçbir işlem yapmaz. Bu, varsayılan olarak geçersiz değerlerin gösterilmeyeceği anlamına gelir. Ayrıca, isDirty_
özelliği ayarlanmayacağından alanın yeniden oluşturulmayacağı anlamına da gelir.
Geçersiz değerleri göstermek istiyorsanız doValueInvalid_
değerini geçersiz kılmanız gerekir.
Çoğu durumda, displayValue_
özelliğini geçersiz değere ayarlamanız, isDirty_
özelliğini true
olarak ayarlamanız ve override
render_ özelliğini kullanmanız gerekir. Bu sayede, blok içi gösterim value_
yerine displayValue_
temel alınarak güncellenir.
doValueInvalid_(newValue) {
this.displayValue_ = newValue;
this.isDirty_ = true;
this.isValueValid_ = false;
}
Çok parçalı değerler
Alanınız çok parçalı bir değer (ör. listeler, vektörler, nesneler) içerdiğinde parçaların ayrı değerler olarak işlenmesini isteyebilirsiniz.
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;
}
Yukarıdaki örnekte newValue
öğesinin her bir özelliği ayrı ayrı doğrulanır. Ardından, doClassValidation_
işlevinin sonunda, herhangi bir özellik geçersizse null
(geçersiz) döndürülmeden önce değer cacheValidatedValue_
özelliğine önbelleğe alınır. Nesnenin ayrı ayrı doğrulanmış özelliklerle önbelleğe alınması, doValueInvalid_
işlevinin her özelliği ayrı ayrı yeniden doğrulamak yerine yalnızca bir !this.cacheValidatedValue_.property
kontrolü yaparak bunları ayrı ayrı işlemesine olanak tanır.
Çok parçalı değerleri doğrulama için kullanılan bu kalıp, yerel doğrulayıcılarda da kullanılabilir ancak şu anda bu kalıbı zorunlu kılmanın bir yolu yoktur.
isDirty_
isDirty_
, alanın yeniden oluşturulması gerekip gerekmediğini belirtmek için setValue
işlevinde ve alanın diğer bölümlerinde kullanılan bir işarettir. Alan değerinin gösterimi değiştiyse isDirty_
genellikle true
olarak ayarlanmalıdır.
Metin
→ Bir alanın metninin nerede kullanıldığı ve alanın değerinden nasıl farklı olduğu hakkında bilgi edinmek için Bir alanın yapısı başlıklı makaleyi inceleyin.
Alanınızın metni, alanınızın değerinden farklıysa doğru metni sağlamak için getText
işlevini geçersiz kılmanız gerekir.
getText() {
let text = this.value_.turtleName + ' wearing a ' + this.value_.hat;
if (this.value_.hat == 'Stovepipe' || this.value_.hat == 'Propeller') {
text += ' hat';
}
return text;
}
Düzenleyici oluşturma
showEditor_
işlevini tanımlarsanız Blockly, tıklamaları otomatik olarak dinler ve uygun zamanda showEditor_
işlevini çağırır. HTML'yi, Blockly'nin kullanıcı arayüzünün geri kalanının üzerinde kayan DropDownDiv ve WidgetDiv adlı iki özel div'den biriyle sarmalayarak düzenleyicinizde gösterebilirsiniz.
DropDownDiv ve WidgetDiv karşılaştırması
DropDownDiv
, bir alana bağlı bir kutunun içinde bulunan düzenleyicileri sağlamak için kullanılır. Görünür sınırlar içinde kalırken otomatik olarak sahaya yakın bir konuma yerleşir. Açı seçici ve renk seçici, DropDownDiv
için iyi birer örnektir.
WidgetDiv
, kutu içinde bulunmayan düzenleyiciler sağlamak için kullanılır. Sayı alanları, alanı bir HTML metin girişi kutusuyla kaplamak için WidgetDiv'i kullanır. DropDownDiv, konumlandırmayı sizin için yaparken WidgetDiv bunu yapmaz. Öğelerin manuel olarak konumlandırılması gerekir. Koordinat sistemi, pencerenin sol üst köşesine göre piksel koordinatlarıdır. Metin girişi düzenleyici, WidgetDiv
için iyi bir örnektir.
DropDownDiv örnek kodu
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 örnek kodu
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);
}
Temizleme
Hem DropDownDiv hem de WidgetDiv, widget HTML öğelerinin yok edilmesini yönetir ancak bu öğelere uyguladığınız tüm etkinlik işleyicilerini manuel olarak kaldırmanız gerekir.
widgetDispose_() {
for (let i = this.editorListeners_.length, listener;
listener = this.editorListeners_[i]; i--) {
Blockly.browserEvents.unbind(listener);
this.editorListeners_.pop();
}
}
dispose
işlevi, DropDownDiv
üzerinde null
bağlamında çağrılıyor. WidgetDiv
bağlamında WidgetDiv
olarak adlandırılır. Her iki durumda da, yukarıdaki DropDownDiv
ve WidgetDiv
örneklerinde gösterildiği gibi, bir dispose işlevi geçirirken bind işlevini kullanmak en iyisidir.
→ Düzenleyicilerin kaldırılmasıyla ilgili olmayan bilgiler için Kaldırma başlıklı makaleyi inceleyin.
Blok içi ekranı güncelleme
render_
işlevi, alanın blok içi gösterimini dahili değeriyle eşleşecek şekilde güncellemek için kullanılır.
Yaygın örnekler:
- Metni değiştirme (açılır liste)
- Rengi değiştirme (renk)
Varsayılanlar
Varsayılan render_
işlevi, görüntülenen metni getDisplayText_
işlevinin sonucuna ayarlar. getDisplayText_
işlevi, maksimum metin uzunluğuna uyacak şekilde kısaltıldıktan sonra alanın value_
özelliğini dizeye dönüştürülmüş olarak döndürür.
Varsayılan engelleme içi gösterimi kullanıyorsanız ve varsayılan metin davranışı alanınız için çalışıyorsa render_
değerini geçersiz kılmanız gerekmez.
Varsayılan metin davranışı alanınız için çalışıyorsa ancak alanınızın blok içi gösteriminde ek statik öğeler varsa varsayılan render_
işlevini çağırabilirsiniz. Ancak alanın boyutunu güncellemek için yine de bu işlevi geçersiz kılmanız gerekir.
Varsayılan metin davranışı alanınız için çalışmıyorsa veya alanınızın blok içi gösteriminde ek dinamik öğeler varsa render_
işlevini özelleştirmeniz gerekir.
Oluşturmayı özelleştirme
Varsayılan oluşturma davranışı alanınız için çalışmıyorsa özel oluşturma davranışı tanımlamanız gerekir. Özel görüntüleme metni ayarlama, resim öğelerini değiştirme ve arka plan renklerini güncelleme gibi işlemler bu kapsamdadır.
Tüm DOM özelliği değişiklikleri geçerlidir. Unutulmaması gereken iki nokta şunlardır:
- DOM oluşturma işlemi, daha verimli olduğu için başlatma sırasında yapılmalıdır.
- Her zaman
size_
özelliğini, blok içi reklamın boyutuna uyacak şekilde güncellemelisiniz.
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_();
}
Güncelleme boyutu
Bir alanın size_
özelliğini güncellemek çok önemlidir. Bu özellik, alanın nasıl konumlandırılacağı konusunda blok oluşturma koduna bilgi verir. size_
simgesinin tam olarak ne olması gerektiğini anlamanın en iyi yolu deneme yapmaktır.
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;
}
Eşleşen blok renkleri
Alanınızdaki öğelerin, bağlı oldukları bloğun renkleriyle eşleşmesini istiyorsanız applyColour
yöntemini geçersiz kılmanız gerekir. Renge, bloğun stil özelliği üzerinden erişmeniz gerekir.
applyColour() {
const sourceBlock = this.sourceBlock_;
if (sourceBlock.isShadow()) {
this.arrow_.style.fill = sourceBlock.style.colourSecondary;
} else {
this.arrow_.style.fill = sourceBlock.style.colourPrimary;
}
}
Düzenlenebilirliği güncelleme
updateEditable
işlevi, alanınızın düzenlenebilir olup olmamasına bağlı olarak nasıl görüneceğini değiştirmek için kullanılabilir. Varsayılan işlev, düzenlenebilirse/düzenlenemezse arka planın fareyle üzerine gelindiğinde yanıt (kenarlık) vermesini/vermemesini sağlar.
Blok içi gösterim, düzenlenebilirliğine bağlı olarak boyut değiştirmemelidir ancak diğer tüm değişikliklere izin verilir.
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;
}
}
Serileştirme
Serileştirme, alanınızın durumunu kaydederek daha sonra Workspace'e yeniden yüklenmesini sağlar.
Çalışma alanınızın durumu her zaman alanın değerini içerir ancak alanınızın kullanıcı arayüzünün durumu gibi başka durumlar da içerebilir. Örneğin, alanınız kullanıcının ülke seçmesine olanak tanıyan, yakınlaştırılabilir bir haritaysa yakınlaştırma düzeyini de serileştirebilirsiniz.
Alanınız serileştirilebiliyorsa SERIALIZABLE
özelliğini true
olarak ayarlamanız gerekir.
Blockly, alanlar için iki dizi serileştirme kancası sağlar. Bir kanca çifti yeni JSON serileştirme sistemiyle, diğer kanca çifti ise eski XML serileştirme sistemiyle çalışır.
saveState
ve loadState
saveState
ve loadState
, yeni JSON serileştirme sistemiyle çalışan serileştirme kancalarıdır.
Bazı durumlarda varsayılan uygulamalar çalışacağından bunları sağlamanız gerekmez. (1) Alanınız temel Blockly.Field
sınıfının doğrudan bir alt sınıfıysa, (2) değeriniz JSON serileştirilebilir bir türse ve (3) yalnızca değeri serileştirmeniz gerekiyorsa varsayılan uygulama sorunsuz bir şekilde çalışır.
Aksi takdirde, saveState
işleviniz alanın durumunu temsil eden JSON serileştirilebilir bir nesne/değer döndürmelidir. loadState
işleviniz aynı JSON serileştirilebilir nesneyi/değeri kabul etmeli ve bunu alana uygulamalıdır.
saveState() {
return {
'country': this.getValue(), // Value state
'zoom': this.getZoomLevel(), // UI state
};
}
loadState(state) {
this.setValue(state['country']);
this.setZoomLevel(state['zoom']);
}
Tam serileştirme ve destek verileri
saveState
ayrıca isteğe bağlı bir parametre doFullSerialization
alır. Bu, normalde farklı bir serileştirici (ör. destekleyen veri modelleri) tarafından serileştirilmiş duruma referans veren alanlar tarafından kullanılır. Parametre, başvurulan durumun blok seri durumdan çıkarıldığında kullanılamayacağını belirtir. Bu nedenle, alan tüm serileştirme işlemlerini kendisi yapmalıdır. Örneğin, tek bir blok seri hale getirildiğinde veya bir blok kopyalanıp yapıştırıldığında bu durum geçerlidir.
Bu özelliğin iki yaygın kullanım alanı şunlardır:
- Bir blok, destekleyen veri modelinin bulunmadığı bir çalışma alanına yüklendiğinde alan, yeni bir veri modeli oluşturmak için kendi durumunda yeterli bilgiye sahiptir.
- Bir blok kopyalanıp yapıştırıldığında alan, mevcut bir veri modeline referans vermek yerine her zaman yeni bir destekleyici veri modeli oluşturur.
Bunu kullanan alanlardan biri yerleşik değişken alanıdır. Normalde, başvurduğu değişkenin kimliğini serileştirir ancak doFullSerialization
doğruysa tüm durumunu serileştirir.
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());
}
Değişken alanı, bir çalışma alanına yüklendiğinde değişkeninin mevcut olmaması durumunda referans oluşturmak için yeni bir değişken oluşturabilmesini sağlamak amacıyla bu işlemi yapar.
toXml
ve fromXml
toXml
ve fromXml
, eski XML serileştirme sistemiyle çalışan serileştirme kancalarıdır. Bu kancaları yalnızca kullanmanız gerekiyorsa (ör.henüz taşınmamış eski bir kod tabanı üzerinde çalışıyorsanız) kullanın. Aksi takdirde saveState
ve loadState
kullanın.
toXml
işleviniz, alanın durumunu temsil eden bir XML düğümü döndürmelidir. fromXml
işleviniz de aynı XML düğümünü kabul etmeli ve bunu alana uygulamalıdır.
toXml(fieldElement) {
fieldElement.textContent = this.getValue();
fieldElement.setAttribute('zoom', this.getZoomLevel());
return fieldElement;
}
fromXml(fieldElement) {
this.setValue(fieldElement.textContent);
this.setZoomLevel(fieldElement.getAttribute('zoom'));
}
Düzenlenebilir ve serileştirilebilir özellikler
EDITABLE
özelliği, alanla etkileşim kurulabileceğini belirten bir kullanıcı arayüzünün olup olmayacağını belirler. Varsayılan olarak true
değerine ayarlanır.
SERIALIZABLE
özelliği, alanın serileştirilip serileştirilmeyeceğini belirler. Varsayılan olarak false
değerine ayarlanır. Bu özellik true
ise serileştirme ve seri durumdan çıkarma işlevleri sağlamanız gerekebilir (bkz. Serileştirme).
CSS ile özelleştirme
Alanınızı CSS ile özelleştirebilirsiniz. initView
yönteminde, alanınızın fieldGroup_
öğesine özel bir sınıf ekleyin,
ardından CSS'nizde bu sınıfa referansta bulunun.
Örneğin, farklı bir imleç kullanmak için:
initView() {
...
// Add a custom CSS class.
if (this.fieldGroup_) {
Blockly.utils.dom.addClass(this.fieldGroup_, 'myCustomField');
}
}
.myCustomField {
cursor: cell;
}
İmleci özelleştirme
Varsayılan olarak, FieldInput
sınıfını genişleten sınıflarda kullanıcı alanın üzerine geldiğinde text
imleci, sürüklenen alanlarda grabbing
imleci ve diğer tüm alanlarda default
imleci kullanılır. Farklı bir imleç kullanmak istiyorsanız CSS kullanarak ayarlayın.