2

バックボーンビュー内に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")and THIS.editor.setData("")(ビューに保存されたエディターへの参照があります)も試しましたが、どちらも同じ結果になりました。何がうまくいかないかについてのアイデアはありますか?

編集
私はまた、この呼び出しでCKEditorとjQueryの統合を使用しようとしましたがTHIS.$el.find('textarea' + this.id).val("");、それはもうフラッシュしませんが、それでもエディターをクリアしません。

4

1 に答える 1

3

問題は 2 つあります。まず、setData関数afterSetDataの最後で関数 を呼び出し、その関数が を呼び出しますgetDatagetDataは関数beforeGetDataの先頭で関数を呼び出し、その関数は を呼び出しますsetData。目標は、深い参照ではなく浅い参照が多いという事実を回避することだったと思いますが、縮小ckeditor.jsされていない場合でも、なぜこれが行われたのかは不明でした。

そして第二に、多くのイベント(フォーカス、キー[ダウン]など)で、エディターからサイトへの投稿を正しく有効/無効にするために、も呼び出していました。が呼び出され、プラグインでの呼び出しでタイミングの問題が発生しました。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()どちらがはるかに軽量で、データ処理がなく、どちらも呼び出されないgetDataためsetData、頻繁に使用する方が適しています。

于 2012-11-20T02:45:58.053 に答える