这个问题已经在How to get data from CKEDITOR5 instance 中得到解答,但是让我们在这里考虑一个有多个编辑器实例的情况。
我想我可以创建自己的全局数组来保存编辑器实例,但如果有内置的东西并得到更好的支持,我宁愿不这样做
没有编辑器实例的存储库。我们可以添加它,但我们认为这不是必不可少的功能。这实际上是人们在 CKEditor 4 中习惯的东西,所以他们从未想过并学会如何自己管理编辑器。
此外,没有单个实例存储库的原因是根本没有中央单例对象。您可以实现多个编辑器类,它们不必相互了解。要建立一个存储库,我们需要再次集中这些东西。
因此,正如您自己指出的那样,存储所有实例的一种简单方法是使用这些实例的全局(在您的应用程序或模块中,不一定是“全局 JS 变量”)映射。
这些实例的键可以是您初始化编辑器的元素的 id:
const editors = {}; // You can also use new Map() if you use ES6.
function createEditor( elementId ) {
return ClassicEditor
.create( document.getElementById( elementId ) )
.then( editor => {
editors[ elementId ] = editor;
} )
.catch( err => console.error( err.stack ) );
}
// In real life, you may also need to take care of the returned promises.
createEditor( 'editor1' );
createEditor( 'editor2' );
// Later on:
editors.editor1.getData();
如果您不为 DOM 中的元素分配 id 怎么办?如果你使用 ES6,那么这不是问题。元素和其他对象一样,可以是地图的键。
const editors = new Map();
function createEditor( elementToReplace ) {
return ClassicEditor
.create( elementToReplace )
.then( editor => {
editors.set( elementToReplace, editor );
} )
.catch( err => console.error( err.stack ) );
}
// In real life, you may also need to take care of the returned promises.
createEditor( textarea1 );
createEditor( textarea2 );
// Later on:
editors.get( textarea1 ).getData();
如果你不能使用 ES6,那么你需要做更多的事情——例如动态地data-editor-id
为你创建编辑器的元素分配一些属性。