node.js - beforeConstruct 中的动态 options.addFields 不起作用
问题描述
我正在考虑在 apostrophe-cms 中创建一个简单的通用可重用纯文本小部件,所以我制作了模块text-only-widgets
。
使用以下代码
在 lib/modules/text-only-widgets/index.js
module.exports = {
extend: 'apostrophe-widgets',
label: 'Section Heading',
beforeConstruct: function (self, options) {
console.log('options.addFields : ', options.addFields)
options.addFields = [
{
name: 'sectionHeading',
label: 'Section Heading',
type: 'string'
}
].concat(options.addFields || [])
}
};
在 lib/modules/text-only-widgets/views/widget.html
{{ data.widget.sectionHeading }}
现在我尝试在我的一个页面中使用上述小部件,如下所示:
<div>
{{
apos.area(data.page, 'aboutUsDescriptionTwo', {
widgets: {
'text-only': {
addFields: [
{
name: 'sectionDescription', // set these fields dynamically
label: 'Section Description', // set these fields dynamically
type: 'string'
}
]
}
}
})
}}
</div>
如下图所示,请注意,即使将带有标签的 addFields 作为Section Description传递给纯文本小部件,也不会覆盖 index.js 中设置的默认值。
我在 index.js 中的 options.addFields 上尝试了 console.log,但它记录未定义,如下所示,我还尝试了一些不同的变体,但没有一个有效。
解决方案
该addFields
选项位于模块级别,它控制此小部件的所有实例存在哪些字段。它不是可以通过 传递给小部件的各个实例的选项apos.area
。因此你不能这样做。
正确的方法是创建第二个模块,用于extend
扩展第一个addFields
模块,并在模块级别添加附加字段。然后,在您所在的地区,您可以只提供两种小部件类型中的一种,或两者都提供,以满足您的需要。
因此,除了lib/modules/text-only-widgets/index.js
你还有:
// in lib/modules/text-plus-description-widgets/index.js
module.exports = {
extend: 'text-only-widgets',
label: 'Section Heading and Description',
addFields: [
{
name: 'sectionDescription',
label: 'Section Description',
type: 'string'
}
]
};
而且这个小部件也有自己的widget.html
.
推荐阅读
- c# - 如何使用 C# 仅保留字符串中的某些单词?
- json - unity Json 添加和删除
- c++ - 如何在 C++ 中遍历多个都遵循类似格式的 .txt 文件?
- sql-server - 试图从变量表中返回两行的百分比
- python - 错误:无法为使用 PEP 517 且无法直接安装的 glpk 构建轮子
- c# - 选择在列表视图子项中找到的多个
- python - Pandas 更高效地合并
- twilio - 我可以向使用 twilio 的人发送带有相应位置的通知吗?
- docker - 是否有正确的方法使用 jfrog CLI 从 Artifactory 下载容器映像以进行 docker pull?
- scala - 如何将成员组标签添加到scaladoc中的参数字段或案例类字段?