Виджет - это только одна часть документа, и документы сохраняются в базе данных как единое целое, а не как отдельные виджеты. Так что нет beforeSave
.
Однако, если вы хотите выполнить какое-либо действие каждый раз, когда виджет очищается для возможного включения в документ, который может быть сохранен, взгляните на метод sanitize
:
self.sanitize = function(req, input, callback) {
var output = self.apos.schemas.newInstance(self.schema);
var schema = self.allowedSchema(req);
output._id = self.apos.launder.id(input._id) || self.apos.utils.generateId();
return self.apos.schemas.convert(req, schema, 'form', input, output, function(err) {
if (err) {
return callback(err);
}
output.type = self.name;
return callback(null, output);
});
};
Обратите внимание, что этот метод принимает input
, то есть данные, предоставленные браузером, и пропускает их через apos.schemas.convert
, чтобы скопировать только действительные данные в output
. Затем он отправляет output
на свой обратный вызов.
Мы можем использовать «супер шаблон» для внесения изменений в конце этого процесса. Например, виджеты форматированного текста обычно не имеют схемы, они просто имеют свойство content
, содержащее разметку. Но они могут иметь схему на некоторых сайтах. Итак, вот как модуль apostrophe-rich-text-widgets
использует «супер шаблон» для расширения метода sanitize
для приема дополнительного содержимого без потери возможности сохранения содержимого схемы:
var superSanitize = self.sanitize;
self.sanitize = function(req, input, callback) {
return superSanitize(req, input, function(err, output) {
if (err) {
return callback(err);
}
output.content = sanitizeHtml(input.content, self.options.sanitizeHtml);
return callback(null, output);
});
};
Обратите внимание, что:
- Исходная версия метода фиксируется в переменной
superSanitize
. Затем в качестве метода назначается новая функция.
- Оригинальная версия
superSanitize
называется. Если не получится, мы сначала разберемся с этим.
output
изменено. Любые изменения, внесенные вами в output
, попадут непосредственно в виджет в документе, поэтому убедитесь, что вы проверяете любой контент, который принимаете с input
. Браузеры (и скрипты, написанные хакерами) могут лгать.
- Мы завершаем то же самое, что и оригинальный метод: вызывая обратный вызов с
(null, output)
.