Валидаторы

Валидатор — это функция, которая принимает новое значение поля и затем действует на него. Это простой способ настроить поле. Они позволяют запускать функциональные возможности при изменении значения поля, изменять вводимые данные или ограничивать допустимые значения.

Некоторые распространенные примеры:

  • Ограничение текстового поля только на прием букв.
  • Требование, чтобы текстовое поле было непустым.
  • Требуется, чтобы дата была в будущем.
  • Изменение формы блока на основе раскрывающегося списка.

Типы валидаторов

Валидаторы выполняются в разное время в зависимости от типа валидатора.

Валидаторы классов являются частью определения класса типа поля и обычно используются для ограничения типа значения, разрешенного полем (например, числовые поля принимают только числовые символы). Валидаторы классов запускаются для всех значений, переданных в поле (включая значение, переданное конструктору).

Дополнительные сведения о валидаторах классов см. в разделе «Реализация валидатора классов» статьи «Создание настраиваемого поля».

Локальные валидаторы определяются во время создания поля. Локальные валидаторы выполняются для всех значений, переданных в поле , кроме значения, переданного конструктору . Это означает, что они работают:

  • Значения, содержащиеся в XML.
  • Значения, передаваемые в setValue.
  • Значения, передаваемые в setFieldValue.
  • Значения изменены пользователем.

Валидаторы классов запускаются перед локальными валидаторами, поскольку они действуют как привратники. Прежде чем передать значение, они проверяют, что значение имеет правильный тип.

Дополнительные сведения о последовательности проверки значений и значениях в целом см. в разделе Значения.

Регистрация локального валидатора

Локальные валидаторы можно зарегистрировать двумя способами:

  • Добавляется непосредственно в конструктор поля.
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);
  }
};

Любой из вышеперечисленных методов можно обернуть расширением для поддержки формата JSON.

Значение поля может сильно различаться в зависимости от типа проверяемого поля (например, в числовом поле будет храниться число, а в поле ввода текста — строка), поэтому перед созданием поля лучше всего прочитать документацию по вашему конкретному полю. валидатор.

Возвращаемые значения

Возвращаемое значение валидатора определяет, что будет делать поле дальше. Есть три возможности:

Измененное возвращаемое значение

Измененное или другое значение, которое затем становится новым значением поля. Это часто используется для очистки значения, например, путем удаления конечных пробелов.

Пример модифицирующего валидатора:

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

Поле ввода текста с модифицирующим валидатором

Нулевое возвращаемое значение

Null, что означает, что данное значение недействительно. В большинстве случаев поле игнорирует входное значение. Точное поведение определяется функцией doValueInvalid_ поля.

Пример валидатора обнуления:

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

Поле ввода текста с обнуляющим валидатором

Неопределенное возвращаемое значение

Неопределено (или без оператора возврата) или входное значение, что означает, что входное значение должно стать новым значением поля. Эти типы валидаторов обычно действуют как прослушиватели изменений.

Пример валидатора прослушивателя:

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

Обратите внимание еще раз на то, что отображаемый текст не обязательно отражает значение поля.

Ценность этого

Внутри валидатора this относится к полю, а не к блоку. Если вам нужно получить доступ к блоку внутри валидатора, используйте функцию getSourceBlock . Вы также можете использовать функцию привязки , чтобы установить контекст, в котором вызывается валидатор.

Пример кода с использованием 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);
  }
};

Пример кода с использованием привязки :

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