Trình xác thực

Trình xác thực là một hàm nhận giá trị mới của các trường, sau đó thực hiện hành động trên giá trị đó. Đây là cách đơn giản để tuỳ chỉnh một trường. Các giá trị này cho phép bạn kích hoạt chức năng khi giá trị của một trường thay đổi, sửa đổi dữ liệu đầu vào hoặc giới hạn những giá trị được chấp nhận.

Một số ví dụ phổ biến:

  • Hạn chế trường văn bản chỉ chấp nhận chữ cái.
  • Yêu cầu trường văn bản không được để trống.
  • Yêu cầu ngày trong tương lai.
  • Sửa đổi hình dạng của một khối dựa trên trình đơn thả xuống.

Các loại trình xác thực

Trình xác thực thực thi tại các thời điểm khác nhau tuỳ thuộc vào loại trình xác thực.

Trình xác thực lớp là một phần của định nghĩa lớp của loại trường và thường được dùng để hạn chế loại giá trị mà trường cho phép (ví dụ: trường số chỉ chấp nhận ký tự số). Trình xác thực lớp được chạy trên tất cả giá trị được truyền đến trường (bao gồm cả giá trị được truyền đến hàm khởi tạo).

Để biết thêm thông tin về trình xác thực lớp, hãy xem phần Triển khai trình xác thực lớp trong phần Tạo trường tuỳ chỉnh.

Trình xác thực cục bộ được xác định tại thời điểm tạo trường. Trình xác thực cục bộ chạy trên tất cả các giá trị được truyền đến trường ngoại trừ giá trị được truyền đến hàm khởi tạo. Điều này có nghĩa là các ứng dụng này chạy trên:

  • Các giá trị có trong tệp XML.
  • Các giá trị được truyền đến setValue.
  • Các giá trị được truyền đến setFieldValue.
  • Giá trị do người dùng thay đổi.

Trình xác thực lớp được chạy trước trình xác thực cục bộ vì chúng hoạt động như người gác cổng. Các hàm này đảm bảo rằng giá trị thuộc đúng loại trước khi truyền giá trị đó.

Để biết thêm thông tin về trình tự xác thực giá trị và giá trị nói chung, hãy xem phần Giá trị.

Đăng ký trình xác thực cục bộ

Bạn có thể đăng ký trình xác thực cục bộ theo hai cách:

  • Thêm trực tiếp vào hàm khởi tạo của trường.
Blockly.Blocks['validator_example'] = {
  init: function() {
    // Remove all 'a' characters from the text input's value.
    var validator = function(newValue) {
      return newValue.replace(/\a/g, '');
    };

    this.appendDummyInput()
        .appendField(new Blockly.FieldTextInput('default', validator));
  }
};
Blockly.Blocks['validator_example'] = {
  init: function() {
    // Remove all 'a' characters from the text input's value.
    var validator = function(newValue) {
      return newValue.replace(/\a/g, '');
    };

    var field = new Blockly.FieldTextInput('default');
    field.setValidator(validator);

    this.appendDummyInput().appendField(field);
  }
};

Bạn có thể gói một trong các phương thức trên trong một tiện ích để hỗ trợ định dạng JSON.

Giá trị của trường có thể rất khác nhau tuỳ thuộc vào loại trường đang được xác thực (ví dụ: trường số sẽ lưu trữ một số, trong khi trường nhập văn bản sẽ lưu trữ một chuỗi). Vì vậy, tốt nhất bạn nên đọc tài liệu cho trường cụ thể của mình trước khi tạo trình xác thực.

Giá trị trả về

Giá trị trả về của trình xác thực xác định thao tác tiếp theo của trường. Có 3 khả năng:

Giá trị trả về đã sửa đổi

Một giá trị đã sửa đổi hoặc khác, sau đó trở thành giá trị mới của trường. Hàm này thường được dùng để dọn dẹp một giá trị, chẳng hạn như bằng cách xoá dấu cách ở cuối.

Ví dụ về Trình xác thực sửa đổi:

// Remove all 'a' characters from the text input's value.
var validator = function(newValue) {
  return newValue.replace(/\a/g, '');
};

Trường nhập văn bản có trình xác thực sửa đổi

Giá trị trả về rỗng

Rỗng, nghĩa là giá trị đã cho không hợp lệ. Trong hầu hết các trường hợp, trường này sẽ bỏ qua giá trị đầu vào. Hành vi chính xác được chỉ định bằng hàm doValueInvalid_ của trường.

Ví dụ về Trình xác thực rỗng:

// Any value containing a 'b' character is invalid.  Other values are valid.
var validator = function(newValue) {
  if (newValue.indexOf('b') != -1) {
    return null;
  }
  return newValue;
};

Trường nhập văn bản có trình xác thực rỗng

Giá trị trả về không xác định

Chưa xác định (hoặc không có câu lệnh trả về) hoặc giá trị đầu vào, có nghĩa là giá trị đầu vào sẽ trở thành giá trị mới của trường. Những loại trình xác thực này thường đóng vai trò là trình nghe thay đổi.

Ví dụ về Trình xác thực trình nghe:

// Log the new value to console.
var validator = function(newValue) {
  console.log(newValue);
};

Xin lưu ý một lần nữa rằng văn bản hiển thị không nhất thiết phải phản ánh giá trị của trường.

Giá trị của this

Bên trong trình xác thực, this tham chiếu đến trường chứ không phải khối. Nếu bạn cần truy cập vào khối bên trong trình xác thực, hãy sử dụng hàm getSourceBlock. Bạn cũng có thể sử dụng hàm liên kết để đặt ngữ cảnh trong đó trình xác thực được gọi.

Mã mẫu sử dụng getSourceBlock:

Blockly.Blocks['colour_match'] = {
  init: function() {
    this.appendDummyInput()
        .appendField(new Blockly.FieldColour(
            null, this.validate
        ), 'COLOUR');
    this.setColour(this.getFieldValue('COLOUR'));
  },

  validate: function(colourHex) {
    this.getSourceBlock().setColour(colourHex);
  }
};

Mã mẫu sử dụng liên kết:

Blockly.Blocks['colour_match'] = {
  init: function() {
    this.appendDummyInput()
      .appendField(new Blockly.FieldColour(
          null, this.validate.bind(this)
      ), 'COLOUR');
    this.validate(this.getFieldValue('COLOUR'));
  },

  validate: function(colourHex) {
    this.setColour(colourHex);
  }
};