Derrick.Jiao 发表于 2021-11-26 11:38:15

自定义组件版编辑器——“插入函数”按钮添加自定义公式

本帖最后由 Derrick.Jiao 于 2021-11-26 11:43 编辑

有小伙伴想要在设计器的插入函数模板中添加自己的自定义函数。那么我们今天就来讲一下这部分应该如何实现。



首先,我们先自定义一个函数,如何自定义函数可以参考学习指南这个demo
https://demo.grapecity.com.cn/sp ... om-functions/purejs
function FactorialFunction() {
                        this.name = "FACTORIAL";
                        this.maxArgs = 1;
                        this.minArgs = 1;
                        this.description = function () {
                              return (
                                        {
                                                description: "菲波那切数列",
                                                parameters: [
                                                      {
                                                                name: 'number01',
                                                                repeatable: false,
                                                                optional: false
                                                      }
                                                ]
                                        }
                              )
                        }
                }
                FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
                FactorialFunction.prototype.evaluate = function (arg) {
                        var result = 1;
                        if (arguments.length === 1 && !isNaN(parseInt(arg))) {
                              for (var i = 1; i <= arg; i++) {
                                        result = i * result;
                              }
                              return result;
                        }
                        return "#VALUE!";
                };

                var factorial = new FactorialFunction();
                GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("FACTORIAL", new FactorialFunction());
               
                spread.addCustomFunction(factorial)
定义完这个函数后,我们需要找这个弹框对应的template。对应的是GC.Spread.Sheets.Designer.TemplateNames.InsertFunctionDialogTemplate。


我们要添加函数的位置在这个数组中


于是我们可以通过bindingPath找到这个位置,并且添加我们的自定义函数对象
function customFontFamilyInFormatDialogTemplate(templateNode) {
                        
                        if (templateNode.bindingPath && templateNode.bindingPath === 'functionDesc.allFunction' && templateNode.items) {

                              templateNode.items.unshift({ text: "FACTORIAL", value: "FACTORIAL" })

                              return;
                        }
                        let nodes = templateNode.content || templateNode.children;
                        if (nodes && nodes instanceof Array) {
                              nodes.forEach((subNode) => customFontFamilyInFormatDialogTemplate(subNode));
                        }
                }

最后把这个template注册回去
GC.Spread.Sheets.Designer.registerTemplate(GC.Spread.Sheets.Designer.TemplateNames.InsertFunctionDialogTemplate, template);
可以看到已经成功加上了

下载附件即可查看完整demo
页: [1]
查看完整版本: 自定义组件版编辑器——“插入函数”按钮添加自定义公式