命令
# 命令用途
现在我们已经完成了数据转换,让我们注册一个 highlight
命令。命令封装了可以由其他插件或用户界面执行的逻辑,例如通过点击编辑器工具栏中的按钮。
# 注册命令
让我们在 Highlight
函数下面创建一个新的 HighlightCommand
类,并在 src/plugin.js
中添加必要的导入。
import { Command } from 'ckeditor5';
class HighlightCommand extends Command {
refresh() {
// Handle state.
}
execute() {
// Command logic.
}
}
然后在 Highlight
函数的底部,添加以下代码来注册命令
editor.commands.add( 'highlight', new HighlightCommand( editor ) );
我们的命令类有两个方法
refresh()
,用于处理状态。execute()
,用于处理逻辑。
# 命令状态
我们的插件只允许文本高亮,所以当编辑器中只选择了一个图像或表格时,我们应该禁用该命令。我们还希望在调用该命令并且所选文本已被高亮时删除高亮。
为此,我们需要一个状态来指示编辑器中的选择是否可以高亮,以及它们是否已被高亮。
命令状态由 refresh()
方法管理。此方法在模型更新时被调用,确保状态被刷新并始终是最新的。
让我们实现 refresh()
方法来更新两个命令属性
isEnabled
,指示当前选择是否允许高亮,value
,指示选择是否已被高亮。
refresh() {
const { document, schema } = this.editor.model;
// Check if selection is already highlighted.
this.value = document.selection.getAttribute( 'highlight' );
// Check if command is allowed on current selection.
this.isEnabled = schema.checkAttributeInSelection( document.selection, 'highlight' );
}
# 命令逻辑
现在我们有了必要的状态,我们可以添加用于更新模型的逻辑。
让我们像这样更新 execute()
方法
execute() {
const model = this.editor.model;
const selection = model.document.selection;
const newValue = !this.value;
model.change( ( writer ) => {
if ( !selection.isCollapsed ) {
const ranges = model.schema.getValidRanges( selection.getRanges(), 'highlight' );
for ( const range of ranges ) {
if ( newValue ) {
writer.setAttribute( 'highlight', newValue, range );
} else {
writer.removeAttribute( 'highlight', range );
}
}
}
if ( newValue ) {
return writer.setSelectionAttribute( 'highlight', true );
}
return writer.removeSelectionAttribute( 'highlight' );
} );
}
对模型的所有更改都是使用 模型写入器 完成的。它的实例在传递给 model.change()
方法的回调中可用,因此我们将使用它。
在回调中,我们首先检查选择是否已折叠。与可以跨越多个字母、元素甚至块的标准选择不同,折叠的选择的范围为零,这意味着它在相同的位置开始和结束。换句话说,折叠的选择只是一个光标。
如果我们处理的是标准(非折叠)选择,我们将检查所有可以使用 highlight
属性的范围,循环遍历它们,并根据当前状态添加或删除此属性。
如果选择已折叠,我们将根据当前状态添加或删除属性。
# 测试更改
让我们测试我们的更改。在浏览器中,选择编辑器中的一些文本。然后打开控制台并运行以下代码
editor.execute( 'highlight' );
如果一切顺利,您选择的文本应该在编辑器中高亮显示。
在 CKEditor 检查器中,打开 Commands
选项卡以查看所有可用命令。highlight
命令也应该列出。
# 下一步
如果您想了解有关命令的更多信息,请参阅 命令 文档。
否则,请转到下一章,您将 了解有关更新模型 UI 的更多信息。
我们每天都在努力使我们的文档保持完整。您是否发现过时信息?是否缺少某些内容?请通过我们的 问题跟踪器 报告。
随着 42.0.0 版本的发布,我们重新编写了大部分文档以反映新的导入路径和功能。我们感谢您的反馈,帮助我们确保文档的准确性和完整性。