首页 > 解决方案 > 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,但它记录未定义,如下所示,我还尝试了一些不同的变体,但没有一个有效。

在此处输入图像描述

标签: node.jsapostrophe-cms

解决方案


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.


推荐阅读