Một số biểu tượng có trạng thái cần được lưu, trong khi một số khác được tạo thực thể dựa trên trạng thái hiện có. Ví dụ: biểu tượng nhận xét cần lưu văn bản, còn biểu tượng cảnh báo thì không vì chúng được tạo thực thể dựa trên cách kết nối các khối.
Nếu biểu tượng cần lưu trạng thái, bạn cần triển khai giao diện ISerializable
và register biểu tượng.
Trạng thái mà biểu tượng trả về sẽ có trong thuộc tính icons
của trạng thái khối:
{
'blocks': {
'languageVersion': 0,
'blocks': [
{
'type': 'my_block',
'icons': {
// Your state goes here!
'my_icon': 'some state',
}
}
]
}
}
Lưu trạng thái
Để lưu trạng thái của biểu tượng, bạn cần triển khai phương thức saveState
của giao diện ISerializable
. Phương thức này có thể trả về tệp json tuỳ ý. Tệp này sẽ được truyền đến phương thức loadState
.
saveState() {
return this.state; // Some arbirtary JSON-compatible data.
}
Chuyển đổi tuần tự đầy đủ và sao lưu dữ liệu
saveState
cũng nhận được một tham số doFullSerialization
không bắt buộc. Tính năng này được sử dụng bởi các biểu tượng tham chiếu đến trạng thái được chuyển đổi tuần tự bởi một trình chuyển đổi tuần tự khác (như mô hình dữ liệu sao lưu). Các tín hiệu tham số báo hiệu rằng
trạng thái được tham chiếu sẽ không có sẵn khi khối được giải tuần tự, vì vậy
biểu tượng này phải chuyển đổi tuần tự tất cả trạng thái sao lưu. Ví dụ: điều này đúng khi một khối riêng lẻ được chuyển đổi tuần tự hoặc khi một khối được sao chép và dán.
Hai trường hợp sử dụng phổ biến cho loại tệp này là:
- Khi một khối riêng lẻ được tải vào một không gian làm việc không tồn tại mô hình dữ liệu sao lưu, biểu tượng đó sẽ có đủ thông tin ở trạng thái riêng để tạo một mô hình dữ liệu mới.
- Khi một khối được sao chép và dán, biểu tượng sẽ luôn tạo một mô hình dữ liệu sao lưu mới thay vì tham chiếu đến một mô hình hiện có.
Trạng thái tải
Để lưu trạng thái của biểu tượng, bạn cần triển khai phương thức loadState
của giao diện ISerializable
. Phương thức này lấy JSON mà phương thức saveState
của bạn trả về.
loadState(state) {
this.state = state;
}
Đăng ký các lớp biểu tượng
Cuối cùng, bạn cần đăng ký biểu tượng để hệ thống chuyển đổi tuần tự có thể tạo thực thể cho biểu tượng đó. Hãy nhớ rằng IconType
dùng để đăng ký biểu tượng cần có cùng chuỗi với chuỗi được phương thức getType
trả về.
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);