برخی از نمادها دارای حالتی هستند که باید ذخیره شوند، در حالی که برخی دیگر بر اساس وضعیت موجود نمونه سازی می شوند. به عنوان مثال، نمادهای نظر باید متن خود را ذخیره کنند، در حالی که نمادهای اخطار این کار را انجام نمی دهند زیرا بر اساس نحوه اتصال بلوک ها نمونه سازی می شوند.
اگر نماد شما باید حالت خود را ذخیره کند، باید رابط ISerializable
را پیاده سازی کنید و نماد خود را ثبت کنید .
حالتی که توسط نماد شما برگردانده می شود در ویژگی icons
حالت بلوک شما قرار می گیرد:
{
'blocks': {
'languageVersion': 0,
'blocks': [
{
'type': 'my_block',
'icons': {
// Your state goes here!
'my_icon': 'some state',
}
}
]
}
}
ذخیره حالت
برای ذخیره وضعیت آیکون خود، باید متد saveState
رابط ISerializable
را پیاده سازی کنید. این متد می تواند json دلخواه را برگرداند که به متد loadState
شما ارسال می شود.
saveState() {
return this.state; // Some arbirtary JSON-compatible data.
}
سریال سازی کامل و داده های پشتیبان
saveState
همچنین یک پارامتر اختیاری doFullSerialization
را دریافت می کند. این مورد توسط نمادهایی استفاده میشود که بهوسیله یک سریالساز متفاوت (مانند مدلهای داده پشتیبان) مرتب شدهاند. این پارامتر نشان می دهد که حالت ارجاع شده زمانی که بلوک از حالت سریال خارج می شود، در دسترس نخواهد بود، بنابراین آیکون باید تمام حالت پشتیبان را خود سریال کند. به عنوان مثال، زمانی که یک بلوک مجزا سریالی می شود، یا زمانی که یک بلوک کپی پیست شده است، این امر صادق است.
دو مورد استفاده رایج برای این عبارتند از:
- هنگامی که یک بلوک منفرد در فضای کاری بارگذاری می شود که در آن مدل داده پشتیبان وجود ندارد، نماد در حالت خودش اطلاعات کافی برای ایجاد یک مدل داده جدید دارد.
- وقتی یک بلوک کپی پیست می شود، نماد همیشه به جای ارجاع به مدل موجود، یک مدل داده پشتیبان جدید ایجاد می کند.
وضعیت بارگذاری
برای ذخیره وضعیت نماد خود، باید متد loadState
رابط کاربری ISerializable
را پیاده سازی کنید. این متد JSON بازگشتی توسط متد saveState
شما را دریافت می کند.
loadState(state) {
this.state = state;
}
ثبت کلاس های نماد
در نهایت باید نماد خود را ثبت کنید تا سیستم سریال سازی بتواند آن را نمونه سازی کند. به یاد داشته باشید که IconType
مورد استفاده برای ثبت نماد شما باید همان رشته ای داشته باشد که با متد getType
آن برگردانده شده است.
class myIcon extends Blockly.icons.Icon {
getType() {
return new Blockly.icons.IconType('my_icon');
}
}
Blockly.icons.registry.register(
new Blockly.icons.IconType('my_icon'), myIcon);