Validator

Validator adalah fungsi yang mengambil nilai baru pada {i>field<i}, dan kemudian bertindak anotasi. Ini adalah cara sederhana untuk menyesuaikan kolom. Memungkinkan Anda memicu fungsionalitas saat nilai {i>field<i} berubah, memodifikasi input, atau membatasi nilai mana masih dapat diterima.

Beberapa contoh umum:

  • Membatasi kolom teks agar hanya menerima huruf.
  • Mengharuskan kolom teks tidak kosong.
  • Mewajibkan tanggal di masa mendatang.
  • Memodifikasi bentuk blok berdasarkan dropdown.

Jenis validator

Validator dijalankan pada waktu yang berbeda, bergantung pada jenis validator yang digunakan alamat IP internalnya.

Validator kelas adalah bagian dari definisi class jenis kolom, dan biasanya digunakan untuk membatasi jenis nilai yang diizinkan oleh {i>field<i} (misalnya angka hanya menerima karakter numerik). Validator kelas dijalankan pada semua nilai diteruskan ke kolom (termasuk nilai yang diteruskan ke konstruktor).

Untuk informasi selengkapnya tentang validator kelas, lihat Mengimplementasikan validator kelas di Membuat Kolom Kustom.

Validator lokal ditentukan pada saat konstruksi kolom. Lokal validator berjalan pada semua nilai yang diteruskan ke kolom kecuali nilai yang diteruskan ke konstruktor standar. Ini berarti iklan tersebut berjalan di:

  • Nilai yang terdapat dalam XML.
  • Nilai yang diteruskan ke setValue.
  • Nilai yang diteruskan ke setFieldValue.
  • Nilai diubah oleh pengguna.

Validator kelas dijalankan sebelum validator lokal karena penjaga gerbang. Mereka memastikan bahwa nilai dari jenis yang benar sebelum meneruskan nyala.

Untuk informasi lebih lanjut tentang urutan validasi nilai, dan nilai dalam lihat Nilai umum.

Mendaftarkan validator lokal

Validator lokal dapat didaftarkan dengan dua cara:

  • Langsung ditambahkan dalam konstruktor kolom.
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);
  }
};

Salah satu metode di atas dapat digabungkan dalam sebuah ekstensi, untuk mendukung format JSON.

Nilai {i>field<i} mungkin sangat berbeda tergantung pada jenis {i>field<i} yang divalidasi (mis. kolom angka akan menyimpan angka, sedangkan kolom input teks akan menyimpan string), jadi sebaiknya baca dokumentasi untuk sebelum membuat validator.

Nilai yang ditampilkan

Nilai yang ditampilkan dari validator menentukan apa yang dilakukan kolom berikutnya. Ada ada tiga kemungkinan:

Nilai Hasil yang Diubah

Nilai yang diubah atau berbeda, yang kemudian menjadi nilai baru kolom. Ini sering digunakan untuk merapikan nilai, seperti dengan menghapus nilai akhir spasi kosong.

Contoh Validator Pengubah:

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

Kolom input teks dengan validator yang memodifikasi

Nilai Hasil Null

Null, artinya nilai yang diberikan tidak valid. Dalam kebanyakan kasus, {i>field <i}akan mengabaikan nilai input. Perilaku yang tepat ditentukan oleh atribut doValueInvalid_ fungsi.

Contoh Validator Nulling:

// 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;
};

Kolom input teks dengan validator nulling

Nilai Hasil yang Tidak Ditentukan

{i>Undefined<i} (atau tanpa pernyataan {i>return<i}) atau nilai input, yang berarti bahwa nilai input harus menjadi nilai baru kolom. Jenis validator ini umumnya bertindak sebagai pemroses perubahan.

Contoh Validator Pemroses:

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

Perhatikan sekali lagi bahwa tampilan text tidak selalu mencerminkan nilai.

Nilainya

Di dalam validator, this merujuk pada kolom, bukan blok. Jika Anda ingin akses blok di dalam validator menggunakan fungsi getSourceBlock. Anda dapat gunakan juga fungsi bind untuk mengatur konteks di mana validator dipanggil.

Kode contoh menggunakan 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);
  }
};

Kode contoh menggunakan bind:

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);
  }
};