2

我在 Backbone 视图中有一个 CKEditor 实例,它带有一个插件,可以在点击时将编辑器中的任何文本发布到我的网站。我也想在点击时清除 CKEditor,但使用 setData 不起作用。它会闪烁,好像正在发生某些事情,但随后会重置为已经存在的相同数据。

它在插件内部调用如下:

注意THIS是一个引用主干视图的变量

CKEDITOR.plugins.add( 'post', {
    init: function( editor ) {
        editor.addCommand('post', {
            exec: function(editor) {
                THIS.model.postMessageAttempt(editor.getData());
                THIS.options.data = "";
                editor.setData("");
            }
        });
        editor.ui.addButton('Post', {
            label: THIS.i18n.postText(),
            command: 'post'
        });

    }
} );

我也尝试过setData("some text")THIS.editor.setData("")(我有一个保存在视图中的编辑器的参考),但两者都有相同的结果。关于出了什么问题的任何想法?

编辑
我也尝试过在这个调用中使用 CKEditor 与 jQuery 的集成,THIS.$el.find('textarea' + this.id).val("");它不再闪烁,但它仍然没有清除编辑器。

4

1 回答 1

3

问题是双重的:首先,在函数末尾setData调用一个函数 ,并且该函数调用. 在函数的开头调用函数并且函数调用. 我认为目标是绕过这样一个事实,即有很多浅引用而不是深度引用,但即使在未缩小的情况下,也不清楚为什么要这样做。afterSetDatagetDatagetDatabeforeGetDatasetDatackeditor.js

其次,为了正确启用/禁用从编辑器到站点的发布,还调用了许多事件(焦点、键 [down] 等)。调用这导致我在插件中调用的时间问题。disableEnablePostdisableEnablePostgetDatasetDatapost

问题:

CKEDITOR.plugins.add( 'post', {
    init: function( editor ) {
        editor.addCommand('post', {
            exec: function(editor) {
                THIS.model.postMessage(editor.getData());
                THIS.options.data = "";
                editor.setData("");
            }
        });
        editor.ui.addButton('Post', {
            label: THIS.i18n.postText(),
            command: 'post'
        });
        editor.on('key', function (event) {
            THIS.disableEnablePost(editor.getCommand( 'post' ), event);
        });
    }
} );

这是我的解决方案

CKEDITOR.plugins.add( 'post', {
    init: function( editor ) {
        editor.addCommand('post', {
            exec: function(editor) {
                THIS.model.postMessage(editor.getData());
            }
        });
       ...
    }
} );

model.postMessage现在在完成时触发一个事件,该事件在视图中被捕获,然后调用此函数:

clearRTE: function() {
    this.editor.setData("");
    this.options.data = "";
}

最后,我进行了更改disableEnablePost,使其不会getData每次都调用,这不是一个好习惯。现在,它调用editor.getSnapshot()了更轻量级的方法,没有数据处理,也没有调用任何一个getDatasetData因此更适合频繁使用。

于 2012-11-20T02:45:58.053 回答