Clark.Pan 发表于 2021-4-6 16:19:48

SpreadJS 自定义单元格实现密码输入(二)

上一期我们讲解了如何用自定义单元格实现密码输入,上一期我们能做到将输入内容显示为“*”的操作,但是通常现实业务在填报密码的过程中,密码的显示也不是明文,这个时候我们就需要在上面的基础上继续改造。在上一期的基础上,首先,我们需要重写createEditorElement方法。方法的意思是创建编辑元素,因为在每次进入编辑状态是都会创建编辑框,这个时候就会触发createEditorElement来创建编辑框相关元素。在该方法中我们一般将编辑框的基本dom元素建立起来,并作为上下文return出去。这里我们直接设置一个password类型的input。PasswordCellType.prototype.createEditorElement = function (context) {
            //Create input presenter.
            var passwordInput = document.createElement("INPUT");
            passwordInput.setAttribute("type", "password");
            return passwordInput;
      };接着,我们需要重写activateEditor方法。该方法在每次激活编辑状态时触发,触发的顺序是先触发createEditorElement之后再触发activateEditor,并且activateEditor中可以获取到editorContext这个上下文,该上下文就是createEditorElement返回的结果。
PasswordCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {
            //Initialize input editor.
            if (editorContext) {
                $editor = $(editorContext);
                GC.Spread.Sheets.CellTypes.Text.prototype.activateEditor.apply(this, arguments);               
                $editor.css("position", "absolute");
                $editor.attr("gcUIElement", "gcEditingInput");
            }
      }这样我们就可以串联起来,在activateEditor中获取上下文,然后在dom上做对应的设置。这里面我们实际不需要再上面做其他设置所以直接调用apply,执行text的源生逻辑。需要注意的是最后这句代码$editor.attr("gcUIElement", "gcEditingInput");声明了这个属性之后,该dom会被SpreadJS认为是SpreadJS本身的一部分,这样在SpreadJS本身的生命周期做处理的时候也会包含该dom。
接着,我们需要设置setEditorValue和getEditorValue,保证editor与表格之间的值传递正确通畅。
PasswordCellType.prototype.setEditorValue = function (editor, value, context) {
            //Sync value from Cell value to editor value.
            $(editor).val(value);
      };
      PasswordCellType.prototype.getEditorValue = function (editor, context) {
            //Sync value from editor value to cell value.
            return $(editor).val();
      };最后,还需要有一些收尾的工作,例如在表格宽度变化后调整editor编辑框的大小。

PasswordCellType.prototype.updateEditor = function (editorContext, cellStyle, cellRect, context) {
            if (editorContext) {
                $editor = $(editorContext);
                $editor.css("width", cellRect.width - 1);
                $editor.css("height", cellRect.height - 3);
            }
      }; 实现效果如下:
表格显示:

进入编辑状态编辑:

完整demo,参考附件

页: [1]
查看完整版本: SpreadJS 自定义单元格实现密码输入(二)