自定义块SelectControl可以工作,但等效的ComboboxControl会给出错误--我的错误在哪里?

时间:2021-03-21 作者:Jeremy Skelton

我在自定义块中有一个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控制台中,但一切正常,并且保存帖子时不会出现错误消息。我不明白是什么造成了不同。

1 个回复
最合适的回答,由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={() => {}}
/>