如何为撇号小部件编写 beforeSave()处理程序?小部件index.js中的代码对我不起作用:
module.exports = {
extend: 'apostrophe-widgets',
label: 'My widget',
addFields: [
{
name: 'label',
type: 'string',
label: 'Caption',
required: true
}
],
construct: function(self, options) {
self.beforeSave = function(callback) {
console.log("beforeSave");
return callback();
}
}
};
当我保存小部件的实例时,日志不会更改。可以为小部件编写自己的 beforeSave()处理程序吗?
答案 0 :(得分:1)
窗口小部件只是文档的一部分,并且文档作为一个单元而不是单个窗口小部件保存到数据库中。因此没有<div> Third Element
<div>
<level3 name="jim">
</level3>
</div>
</div>
。
但是,如果您想要做的是每次清洁窗口小部件以潜在地包含在可以保存的文档中时采取一些措施,请查看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
调用回调。