2015-03-25 36 views
0

之前的状态我在编写ckeditor插件时遇到撤消问题。 我正在使用editor.insertHtml将具有某个类的div添加到文档中。如果我从一个空白文档开始,撤消和重做都不会被点亮。当我执行该命令时,撤消将亮起。如果我按撤消,两者都会亮起。 “撤消”不会恢复文档内容。撤销不会将文档内容恢复到editor.insertHtml

为什么不呢?

CKEDITOR.plugins.add('plugin_name', 
{ 
    init: function(editor) 
    { 
    editor.ui.addButton('Button_name', 
    { 
     label: 'some text', 
     command: 'Command_name', 
     icon: this.path + 'images/icon.png' 
    }); 

    editor.addCommand('Command_name', { canUndo: true, exec: function() 
    { 
     editor.fire('saveSnapshot'); 
     editor.insertHtml("<div contenteditable='false' class='foobar'></div>\r\n"); 
     editor.fire('saveSnapshot'); 
    }}); 
    } 
}); 

我也弄不明白,为什么之前和HTML插入后需要快照的节省,但那是另一回事。

回答

1

首先 - editor.insertHtml()负责拍摄快照,因为它是一种高级方法。如果你停止射击editor#saveSnapshot可能会有所帮助。

第二件事 - 因为您的命令有canUndo设置为true当您执行快照时会自动记录。因此,我建议将其设置为false以使editor.insertHtml()成为保存快照的唯一人员。

如果以上方法无效,那么您需要检查已拍摄的快照。要做到这一点,只需访问editor.undoManager.snapshots。在你的情况下,应该有两个 - 初始内容和执行命令后执行的一个。不幸的是调试撤消管理器是一个痛苦...

我也不明白为什么在插入html之前和之后需要保存快照,但这是另一回事。

这是一个很好的问题。但让我们概括一下 - 为什么我需要在之前和更改内容之后拍摄快照? CKEditor的4.4.3之前

IIRC有两方面的原因,现在只有左二:

  • 因为最初快照栈是空的,所以记录的初始内容,
  • 为键入文本从单独的在那之后完成改变。

第一个是一个古怪的行为,终于在几个发布前修好了。现在最初的快照是在editor#instanceReady上拍摄的。

但第二个依然如此。当你开始输入编辑器开始计数键时,每25次记录一次快照。但是,如果例如你输入5个字符,然后按下粗体按钮,你希望这5个字符被保存为一个单独的动作,并按第二个粗体。这就是为什么粗体命令在执行之前拍摄快照的原因 - 记录包含这5个新字符的快照,然后用另一个快照记录<strong></strong>元素的插入。

事实上,最有可能的录制键击可以在不需要动作之前拍摄快照的方式实现。这需要在插入每个字符后拍摄快照,然后对它们进行分组。这是可能的,但它会更重。

可悲的是,最近我们需要开始为每个键快照,以处理一些棘手的情况下输入和删除文本。没有可靠的方法来告诉​​是否会插入/移除一个字符,并且良好的撤销管理器应该将打字和删除分开。所以我们需要知道在之前的字符插入后的内容是什么,以防下面的情况退格/删除按下,反之亦然。

换句话说 - 在我们对撤消管理器进行了最近的更改之后,也许今天可以简化所有这些。但有一点是肯定的 - 实现一个好的撤销管理器(特别是在你不控制字符插入的情况下)是非常棘手的,很少有正确的做法。

PS。 "\r\n"在要插入的HTML末尾没有区别。

+0

将'canUndo'设置为_false_并移除这些'editor.fire('saveSnapshot');'做了诡计! – 2015-03-26 08:32:13