如何在ckeditor5小部件内为输入创建可编辑标签?

时间:2019-11-25 21:17:04

标签: ckeditor ckeditor5

以下是我尝试生成的一些HTML示例:

<div>
    <input type="checkbox" id="checkbox_1" name="checkbox_1" />
    <label for="checkbox_1"></label>
</div>

这是我的垂头丧气的转换器:

conversion.for( 'downcast' ).elementToElement( {
    model: 'checkbox',
    view: ( modelElement, viewWriter ) => {
        const div = viewWriter.createContainerElement( 'div', {} );
        const input = viewWriter.createEmptyElement( 'input', {'type': 'checkbox'} );
        const label = viewWriter.createEditableElement( 'label', {} );

        viewWriter.insert( viewWriter.createPositionAt( div, 0 ), input );
        viewWriter.insert( viewWriter.createPositionAt( div, 1 ), label );
        return toWidgetEditable( div, viewWriter );
    }
} );

在CKEditor 5检查器中,我可以看到视图是这样呈现的:

<div contenteditable="true" class="ck-editor__editable ck-editor__nested-editable">
    <input type="checkbox" />
    <label>
    </label>
</div>

在编辑器中,我无法在标签或周围的div中添加文本。

如果将div的声明从createContainerElement更改为createEditableElement,我可以在div中插入文本,但是仍然无法编辑标签。

如何设置转换器,以便在<input>上贴上可编辑的标签?我尝试查看todolist中的ckeditor5-list代码,但是它根本不使用conversion.forelementToElement,所以我有点迷路了。

1 个答案:

答案 0 :(得分:0)

您发布的代码不正确,因为您无法从头开始创建这样的视图元素。如果它们应该是可编辑的,则需要将它们映射到模型中的某些内容。除非这被认为是不可编辑的区域。在这种情况下,请不要使用.exetoWidget()

第二个问题是在编辑器中使用可聚焦字段必须非常小心。这些元素必须在小部件的不可编辑部分内,此外,您还需要停止编辑器处理它们上的事件。目前,这只能通过黑客来实现:

toWidgetEditable()

请参阅:https://github.com/ckeditor/ckeditor5-core/compare/proto/input-widget#diff-44ca1561ce575490eac0d660407d5144R239