Валидаторы

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

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

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

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

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

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

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

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

  • Значения, содержащиеся в 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

Значение 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;
};

Поле ввода текста с валидатором null

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

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

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

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

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

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

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

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

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