CKEditor 4:在插件对话框中添加动态选择元素

时间:2014-07-19 13:28:19

标签: jquery ajax ckeditor

我正在尝试使用Ajax查询中的数据填充select元素。我收到了数据:

  

['这是对这个书签的评论。 ......,250'],[哇,   另一个评论。 ......,251',['好吧,这只是另一个评论。   ......,252']

...但我不能用数据填充实际的select元素。到目前为止,我有:

CKEDITOR.dialog.add( 'commentDialog', function( editor ) {

    function get_bookmark_comments_as_object () {
        var objBookmark = new Object({
            items: []
        });
        objBookmark.id = 7193;
        $.ajax({
            url: base_url + "comments/jq_get_bookmark_comments_as_object/" + objBookmark.id,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            cache: false,
            async: false,
            success: function (element) {
                for (var i=0;i<element.length;i++) {
                    objBookmark.items.push("['" + element[i].comment_snippet + ", " + element[i].bookmark_comment_id + "']");
                }
                String.prototype.unquoted = function () { return this.replace (/(^")|("$)/g, '') }
                var string = objBookmark.items.join(', ');
                console.log(string);
                return string.unquoted();
            },
            error: function () {

            }
        });
    }

...

......和:

return {
    // Basic properties of the dialog window: title, minimum size.
    title: 'Comment Properties',
    minWidth: 400,
    minHeight: 200,
    // Dialog window contents definition.
    contents: [
        {
            // Definition of the Basic Settings dialog tab (page).
            id: 'tab-basic',
            label: 'Basic Settings',
            // The tab contents.
            elements: [
                {
                    // Text input field for the abbreviation text.
                    type: 'select',
                    id: 'comment',
                    label: 'Select a Comment',
                    items: [['Select a Comment', 0]].concat( get_bookmark_comments_as_object() ),
                    setup: function( element ) {
                        this.setValue( element.getText() );
                    },
                    commit: function( element ) {
                        ...
                    }
                }
            ]
        }
    ],

正如您在get_bookmark_comments_as_object()函数中看到的那样,我将以确切的格式返回一个字符串。

任何返回普通数组或字符串的尝试都会使select元素表现得很奇怪(例如,字符串周围的双引号会导致CKEditor将整个字符串拆分为字符部分)。然而,当我从console.log()结果中复制并粘贴时,它可以正常工作。

我为items: ...尝试了多种变体,没有可用的结果。

我尝试将jQuery / Ajax代码放在setup: ...commit: ...中,但没有可用的结果。

我也尝试了fix from a similar thread,但这也没有做任何事情。

我已经尽我所能,剩下的东西对我来说是个谜。

更新

经过一番抨击后,我发现了:

var items = [['And here&#39;s a comment on this Bookmark. ...', '250'], ['Wow, another comment. ...', '251'], ['Okay, it&#39;s just another comment. ...', '252']];

...有效,而:

var items = get_bookmark_comments_as_object();

...不会,即使字符串相同。

所以,无论出于何种原因,CKEditor(或者,我认为,JavaScript)都在窒息,我不知道是什么。

2 个答案:

答案 0 :(得分:0)

以下是我在CKEDITOR小部件对话框中所做的事情。

std::chrono::system_clock::now()

答案 1 :(得分:0)

要可靠地执行此操作,我发现您必须在小部件的“ onLoad”功能中执行AJAX请求。从那里,您可以使用其“添加”功能填充窗口小部件。需要注意的是,您需要将窗口小部件分配给AJAX回调函数之外的变量(使用'this')。

{
    type: 'select',
    id: 'myselect',
    label: 'The select will be empty until it is populated',
    items: [ ],
    onLoad: function(api) {
        widget = this;
        $.ajax({
            type: 'GET',
            url: 'path/to/your/json',
            dataType: 'json',
            success: function(data, textStatus, jqXHR) {
                for (var i = 0; i < data.length; i++) {
                    widget.add(data[i]['label'], data[i]['value']);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                console.log('ajax error ' + textStatus + ' ' + errorThrown);
            },
        });
    },
},