这个问题在如何从CKEDITOR5实例中获取数据已经有了答案,但是我们在这里考虑一种有多个编辑器实例的情况。
我想我可以创建自己的全局数组来保存编辑器实例,但如果有内置且支持更好的东西,我宁愿不这样做。
没有编辑器实例的存储库。我们可以添加它,但我们认为这不是一个必要的功能。实际上,人们在CKEditor 4中习惯了这个功能,所以他们从未想过或学会如何自行管理他们的编辑器。
此外,没有单个实例存储库的原因是根本没有中央单例对象。您可以实现多个编辑器类,它们不必彼此了解。要想出一个存储库,我们需要再次将这些东西集中起来。
因此,正如您自己指出的那样,存储所有实例的简单方法是通过拥有这些实例的全局(在您的应用程序或模块中全局,而不一定是“全局JS变量”)映射。
这些实例的键可以是您初始化编辑器的元素的ID:
const editors = {};
function createEditor( elementId ) {
return ClassicEditor
.create( document.getElementById( elementId ) )
.then( editor => {
editors[ elementId ] = editor;
} )
.catch( err => console.error( err.stack ) );
}
createEditor( 'editor1' );
createEditor( 'editor2' );
editors.editor1.getData();
如果您不为DOM元素分配ID会怎样? 如果您使用ES6,则这不是问题。 元素(如其他对象)可以作为Map键。
const editors = new Map();
function createEditor( elementToReplace ) {
return ClassicEditor
.create( elementToReplace )
.then( editor => {
editors.set( elementToReplace, editor );
} )
.catch( err => console.error( err.stack ) );
}
createEditor( textarea1 );
createEditor( textarea2 );
editors.get( textarea1 ).getData();
如果您无法使用ES6,则需要做更多的工作 - 例如,在创建编辑器的元素上动态分配一些 data-editor-id
属性。