我在自定义块中有一个SelectControl,用于设置元字段。它可以工作,但如果它是一个ComboboxControl就更好了,因为选项列表可能会增加,但当我将其切换到Combobox时,会出现错误-所有其他设置都保持不变。这当前正在本地主机上使用WAMP运行。
定义如下:
<ComboboxControl
label="Speaker"
options={speakeropts()}
help=\'Choose from list - new speakers need to be added to the list by an administrator\'
value={ speakerValue }
onChange={ updateSpeakerValue }
/>
以及设置
const speakerlist=wp.data.select(\'core\').getEntityRecords(\'taxonomy\', \'speakers\',{order_by: \'name\', per_page: 100});
function speakeropts(){
var options=[];
options.push({value:\'0\', label:\'\'}); // first entry on list is blank
if (speakerlist) {
speakerlist.forEach((sp) => { // simple foreach loop
options.push({value:sp.id, label:sp.name});
});
}
return options;
}
const speakerValue = meta[\'ach-td-speaker\'];
function updateSpeakerValue( newValue ) {
setMeta( { ...meta, \'ach-td-speaker\': newValue } );
};
有两个问题。
单击框(设置焦点)会在Chrome的控制台窗口中显示错误
react-dom.min.js?ver=16.13.1:32 Uncaught TypeError: p is not a function
at onFocus (components.min.js?ver=863b0e64189bf5cd6b5aced6797bc2d6:7)
at Object.ki (react-dom.min.js?ver=16.13.1:176)
at ji (react-dom.min.js?ver=16.13.1:13)
at mi (react-dom.min.js?ver=16.13.1:13)
at lf (react-dom.min.js?ver=16.13.1:13)
at wi (react-dom.min.js?ver=16.13.1:187)
at Kd (react-dom.min.js?ver=16.13.1:32)
at pc (react-dom.min.js?ver=16.13.1:32)
at Wf (react-dom.min.js?ver=16.13.1:34)
at react-dom.min.js?ver=16.13.1:236
然后,当我保存帖子时(选择一个项目没有问题,并调用“onChange”函数),我会收到另一个javascript错误
POST http://localhost/wp-json/wp/v2/talks/34?_locale=user 400 (Bad Request)
Wordpress管理屏幕上还有一条错误消息
Updating failed. meta.ach-td-speaker is not of type string.
后一条消息对我来说毫无意义,因为它肯定是string类型的
register_post_meta( \'talks\', \'ach-td-speaker\', array(
\'show_in_rest\' => true,
\'single\' => true,
\'type\' => \'string\',
) );
我假设如果控件是组合框而不是选择,那么问题就不同了,但我无法想象它可能是什么-参数的文档似乎完全相同。虽然我有50年的编程经验,但我对Javascript还是新手,所以很容易会错过一些东西。有没有人有什么想法或建议,下一步该怎么做?
更新:我将选项代码更改为
const speakerlist=wp.data.select(\'core\').getEntityRecords(\'taxonomy\', \'speakers\',{order_by: \'name\', per_page: 100});
function speakeropts(){
var options=[];
if (speakerlist) {
speakerlist.forEach((sp) => { // simple foreach loop
options.push({value:String(sp.id), label:sp.name});
});
}
return options;
}
虽然当控件获得焦点时,Javascript错误会出现在Chrome控制台中,但一切正常,并且保存帖子时不会出现错误消息。我不明白是什么造成了不同。
最合适的回答,由SO网友:Daniel Powney 整理而成
我花了一段时间才弄明白。。。这是一只虫子。发生JavaScript错误的原因是未定义onFilterValueChange函数。。。尽管WordPress文档中说这个函数是可选的。只需使用匿名函数添加onFilterValueChange即可删除JavaScript错误。
例如。
<ComboboxControl
label="Font Size"
value="small"
options={[
{
value: "small",
label: "Small"
},
{
value: "normal",
label: "Normal"
},
{
value: "large",
label: "Large"
},
{
value: "huge",
label: "Huge"
}
]}
onInputChange={(inputValue) =>
setFilteredOptions(
[
{
value: "small",
label: "Small"
},
{
value: "normal",
label: "Normal"
},
{
value: "large",
label: "Large"
},
{
value: "huge",
label: "Huge"
}
].filter(option =>
option.label.toLowerCase().startsWith(inputValue.toLowerCase())
)
)
}
onFilterValueChange={() => {}}
/>