假设我们创建了一个简单的小部件,其中可能包含字符串或RTF字段。当我将小部件插入html时,我想指定哪个字段是可见/活动的。换句话说,我想向小部件添加一些自定义选项,这将改变其行为。 小部件如下所示:
{{
apos.singleton(data.page, 'footerTitle', 'footerTitle', {
controls: {
movable: false,
position: 'top-right'
}
})
}}
我想做这样的事情:
{{
apos.singleton(data.page, 'footerTitle', 'footerTitle', {
controls: {
movable: false,
position: 'top-right'
},
settings: {
type: 'string',
anotherParameter: 1,
thirdParameter: false
}
})
}}
稍后(在小部件的index.js内)这些参数将相应地处理:
...
beforeConstruct: function( self, options )
{
if (type === 'string')
{
// Do some additional setup, magic, whatever...
}
switch (anotherParamter)
{
// Add some insane code here :)
}
},
construct: function( self, options )
{
const superLoad = self.load;
self.load = ( req, widgets, callback ) => superLoad( req, widgets, ( err ) =>
{
if( err )
{
return callback( err );
}
for( const widget of widgets )
{
// Some additional work here based on the initial settings.
}
return callback( null );
} );
}
...
是否有可能向小部件添加自定义参数,选项(在2.9.1版或更高版本的3.0.0中)?
答案 0 :(得分:3)
这不可能像您在Apostrophe 2.x中显示的那样进行,因为窗口小部件选项是从模板传递的,并且模板只能执行同步工作。小部件模块的load
方法已在这一点上运行。所以现在影响事物的获取为时已晚。
但是,有一种方法可以获取所需的效果。在这种情况下,我们要做的是创建小部件的子类,并在每个位置使用适当的子类。另外,有时我们在小部件的架构中使用select元素。
在两种情况下,您都可以根据情况修改load
的行为。
对于子类化方法,可以编写第二个模块来扩展第一个模块:
// in lib/modules/subclass-widgets
module.exports = {
name: 'subclass',
extend: 'original-widgets',
construct: function(self, options) {
var superLoad = self.load;
self.load = function(req, widgets, callback) {
// ... we can call superLoad if we want or completely replace it
};
}
}
然后在模板中提供original
,subclass
或两者都选择。
对于选择字段替代,您可以仅使用一种窗口小部件类型:
// in lib/modules/cool-widgets/index.js
module.exports = {
name: 'cool',
addFields: [
{
name: 'subtype',
label: 'Subtype',
type: 'select',
choices: [
{
label: 'One',
value: 'one'
},
{
label: 'Two',
value: 'two'
},
]
}
]
construct: function(self, options) {
self.load = function(req, widgets, callback) {
for (const widget of widgets) {
if (widget.subtype === 'two') { ... }
}
};
}
最佳选择取决于您通常是否每次都会为用户提供选择,并且代码不会产生太大差异(使用select元素)还是要限制用户在每个模板中可以做的事情(而是使用子类,并且仅在每个模板中放置与用例匹配的子类。
对于3.0版,将有一些方法可以实现您最初在3.0版中提出的要求。一方面,output
方法是3.x中的async
方法。这意味着您可以覆盖它并使用选项进行异步工作。另外,3.x在模板中支持异步组件:
https://github.com/apostrophecms/apostrophe/issues/1668
(已关闭,因为它是在3.0分支中实现的)
但是,3.0的发行版尚需时日,现在尚不该在其上启动项目。版本2.x到2023年都有企业支持,作为维护者,我们今天在2.x上启动新的企业项目,所以我不建议您等待。
3.0的发展在今年夏天有所放缓,因为我们将Apostrophe Technologies扩展到了自己的公司中,并进行了基于2.x的其他企业支持工作,但是从长远来看,这是我们可以投入工作并继续追求的目标在接下来的几个月中,效率将大大提高3.0。