Sao chép và dán

Blockly hỗ trợ các thao tác sao chép, cắt và dán cho một số thành phần tích hợp sẵn, chẳng hạn như khối, bình luận trên không gian làm việc và bong bóng.

Hành vi mặc định của bảng nhớ tạm

Lõi Blockly đi kèm với phím tắt có thể cắt, sao chép hoặc dán các khối, bình luận trên không gian làm việc và mọi thành phần khác triển khai các giao diện ICopyable, IDraggableIDeletable. Công cụ này cũng có lựa chọn trình đơn theo bối cảnh để sao chép một khối. Bạn có thể sửa đổi hoặc xoá các lối tắt và mục trong trình đơn mặc định đó nếu cần.

Trong chế độ triển khai bảng nhớ tạm mặc định, các đối tượng có thể sao chép chỉ có thể được dán vào không gian làm việc mà chúng được sao chép hoặc vào không gian làm việc đích nếu chúng được sao chép từ một bảng chọn. Điều này có nghĩa là bạn có thể sao chép một khối từ một trình đơn bật lên vào không gian làm việc đích của trình đơn bật lên đó, nhưng bạn không thể sao chép một khối từ không gian làm việc chính này sang không gian làm việc chính khác.

Sao chép và dán giữa các không gian làm việc và thẻ

Nếu muốn cho phép người dùng sao chép các khối từ một không gian làm việc và dán vào một không gian làm việc khác, hoặc thậm chí vào một không gian làm việc trong bản sao của ứng dụng đang chạy ở một thẻ khác, bạn có thể cài đặt trình bổ trợ @blockly/plugin-cross-tab-copy-paste.

Hành vi tuỳ chỉnh của bảng nhớ tạm

Nếu muốn có hành vi khác, bạn có thể triển khai một bảng tạm tuỳ chỉnh bằng cách gỡ cài đặt các phím tắt đi kèm với Blockly và cài đặt các phím tắt khác hoạt động theo cách khác. Để tạo điều kiện thuận lợi cho việc này, bạn có thể dùng các phương thức trong không gian tên Blockly.clipboard để sao chép, dán hoặc kiểm soát chi tiết hơn, chẳng hạn như đặt không gian làm việc mà một đối tượng được sao chép.

Đối tượng tuỳ chỉnh có thể sao chép

Bạn có thể tạo các mục tuỳ ý tương thích với hệ thống sao chép/dán bằng cách sử dụng 5 giao diện: ICopyable, IDraggableIDeletable để biểu thị các đối tượng có thể sao chép, ICopyData để biểu thị các đối tượng đã sao chép và IPaster để biểu thị các đối tượng có thể chuyển dữ liệu sao chép trở lại thành các đối tượng có thể sao chép. Mọi loại ICopyable đều cần một IPaster được liên kết có thể dán dữ liệu đó.

Mọi đối tượng triển khai ICopyable,IDraggableIDeletable, đồng thời có IPasterICopyData tương ứng sẽ tự động hoạt động với hệ thống bảng nhớ tạm mặc định.

Có rất ít trường hợp bạn muốn triển khai một đối tượng có thể sao chép tuỳ chỉnh hoặc một đối tượng dán tuỳ chỉnh (ví dụ: trình bổ trợ chọn nhiều), vì các đối tượng có thể sao chép được kết xuất và bạn không thể thêm các đối tượng được kết xuất mới vào Blockly. Các đối tượng được kết xuất duy nhất có thể tồn tại trong một không gian làm việc là các khối, bong bóng và bình luận trong không gian làm việc.

Triển khai một đối tượng có thể sao chép

Để tạo một đối tượng có thể sao chép, bạn cần triển khai các giao diện ICopyable, IDraggableIDeletable. Hai giao diện sau là bắt buộc để có thể thao tác và xoá một đối tượng được dán.

Có thể chọn

Giao diện ICopyable mở rộng giao diện ISelectable, tức là bạn cũng cần triển khai các phương thức và thuộc tính đó.

Bạn phải chọn được đối tượng vì phím tắt sẽ xem xét đối tượng đã chọn để xác định nội dung cần sao chép.

class MyCopyable implements ISelectable {
  constructor(workspace) {
    this.id = Blockly.utils.idGenerator.genUid();
    this.workspace = workspace;
  }

  select() {
    // Visually indicate this draggable is selected.
  }

  unselect() {
    // Visually indicate this draggable is not selected.
  }
}

Có thể sao chép

Bản thân giao diện ICopyable chỉ có một phương thức bắt buộc là toCopyData. Phương thức này trả về một biểu thị có thể chuyển đổi tuần tự thành JSON về trạng thái của đối tượng có thể sao chép. Bạn có thể dùng biểu thị này để tạo lại đối tượng có thể sao chép.

Dữ liệu sao chép cũng phải có thuộc tính paster. Thuộc tính này lưu giữ tên chuỗi đã đăng ký được liên kết với trình dán sẽ dán dữ liệu sao chép này. Để biết thêm thông tin về trình dán, hãy xem bài viết Triển khai trình dán.

class MyCopyable implements ICopyable {
  constructor(workspace, state) {
    this.workspace = workspace;
    this.myState = state;
  }

  toCopyData() {
    return {
      // This string matches the string used to register the paster.
      paster: 'MY_PASTER',
      state: this.myState,
    };
  }
}

ICopyable cũng có một phương thức không bắt buộc là isCopyable, phương thức này trả về liệu một đối tượng có thể sao chép hay không.

Có thể kéo và xoá

Để biết thông tin về cách triển khai IDraggableIDeletable, hãy xem phần Đối tượng có thể kéo tuỳ chỉnh.

Triển khai trình dán

Để tạo một trình dán, bạn cần triển khai giao diện IPaster. Nó chỉ có một phương thức paste nhận dữ liệu sao chép của đối tượng mà nó dán, không gian làm việc để dán đối tượng vào và một toạ độ không bắt buộc, là vị trí để dán đối tượng.

class MyPaster implements IPaster {
  paste(copyData, workspace, coordinate) {
    return new MyCopyable(workspace, copyData.state);
    // Optionally position the copyable at the passed coordinate.
    // Optionally select the copyable after it is pasted.
  }
}

Đăng ký

Sau khi triển khai một trình dán, bạn cần đăng ký trình dán đó để có thể tìm thấy trình dán được liên kết với một dữ liệu sao chép nhất định từ thuộc tính paster của trình dán.

// This string matches the string assigned to the 'paster' property.
Blockly.clipboard.registry.register('MY_PASTER', new MyPaster());