Một số biểu tượng có trạng thái cần được lưu, trong khi một số biểu tượng 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 phải 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 các khối được tạo đã kết nối.
Nếu biểu tượng cần lưu trạng thái, bạn cần triển khai
ISerializable
và đăng ký
.
Trạng thái mà biểu tượng trả về sẽ được đưa vào thuộc tính icons
của
trạng thái của 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 ISerializable
. Phương thức này có thể trả về tệp json tuỳ ý, tệp này được chuyển đến tệp
loadState
.
saveState() {
return this.state; // Some arbirtary JSON-compatible data.
}
Dữ liệu sao lưu và chuyển đổi tuần tự đầy đủ
saveState
cũng nhận được một tham số doFullSerialization
(không bắt buộc). Đây là
được sử dụng bởi các biểu tượng tham chiếu trạng thái được chuyển đổi tuần tự bởi
trình chuyển đổi tuần tự (như mô hình dữ liệu sao lưu). Thông số này 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
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.
Có hai trường hợp sử dụng phổ biến cho vấn đề này:
- Khi một khối riêng lẻ được tải vào một không gian làm việc nơi dữ liệu sao lưu mô hình không tồn tại, biểu tượng 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, biểu tượng sẽ luôn tạo một bản sao lưu mới thay vì tham chiếu một mô hình dữ liệu 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 ISerializable
. Phương thức này lấy JSON do phương thức saveState
trả về.
loadState(state) {
this.state = state;
}
Đăng ký 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 nó. Xin lưu ý rằng IconType
được dùng để đăng ký
biểu tượng cần có cùng một chuỗi với chuỗi được trả về bởi
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);