onevent on f: ajax приводит к тому, что модель не обновляется - PullRequest
1 голос
/ 15 февраля 2012

Я добавил TinyMCE на веб-сайт (JSF-2, Tomcat 7, Mojarra 2.1.6). Когда пользователь нажимает кнопку «Обновить», текст HTML в редакторе анализируется и печатается где-то еще на странице.

Мне нужно отключить TinyMCE перед запросом Ajax (в противном случае у меня будет два редактора). Это также рекомендуется в документации TinyMCE.

Итак, я добавил событие f: ajax к кнопке:

<h:commandButton value="#{msg['rt.refresh']}" action="#{updateTextAction.execute}" onclick="cleanupRte();">
<f:ajax event="action" execute="@this" render="@all" onevent="disposeTinyMce" />
</h:commandButton>

функции javascript вызываются правильно:

function cleanupRte() {
  tinyMCE.triggerSave();

  return true;
}

и метод onevent:

function disposeTinyMce(e) {

    if(e.status == 'begin') {
        tinyMCE.triggerSave();

        var elem = document.getElementById("mainForm:rteExtAdr:input");
        alert(elem.value);

        tinyMCE.execCommand('mceRemoveControl', false, 'mainForm:rteExtAdr:input');
    }
    if(e.status == 'complete') {
    }
    if(e.status == 'success') { 
        tinyMCE.execCommand('mceAddControl', false, 'mainForm:rteExtAdr:input');
    }

    return true;
}

, который отключает редактор и добавляет его обратно на страницу. Это работает нормально.

Проблема в том, что модель не обновляется значением из текстового поля, хотя предупреждение показывает правильное значение. Запрос также содержит «старое» значение из текстового поля.

Есть ли что-то, что мешало бы вызову ajax увидеть текущие значения формы? или он считывает значения перед выполнением функции onevent?

Если я удаляю тег f: ajax полностью, модель обновляется, но у меня возникают проблемы с дублированием редактора TinyMce после ответа.

вызов инициализации:

tinyMCE.init({
    mode : "textareas",
    theme : "advanced",
    editor_selector : "sesamWysiwyg", 
    language : "de",
    force_br_newlines : true,
    force_p_newlines : false,
    inline_styles : false,
    forced_root_block : '', // Needed for 3.x
    plugins : "autolink,lists,style,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,searchreplace,print,paste,directionality,noneditable,visualchars,nonbreaking,xhtmlxtras,wordcount,advlist",

    formats : {
            underline : {inline : 'u', exact : true},
            strikethrough : {inline : 'del', exact : true}
    },

    theme_advanced_buttons1 : "bold,underline,strikethrough,|,cut,copy,paste,pastetext,pasteword,search,replace,|,undo,redo,|,code,removeformat,|,charmap",
        theme_advanced_buttons2 : "",
        theme_advanced_buttons3 : "",
        theme_advanced_buttons4 : "",
        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",

        content_css : "css/content.css",

    });

Любые идеи или предложения будут великолепны!

спасибо:)

1 Ответ

2 голосов
/ 15 февраля 2012

Это не вызвано функцией обработчика onevent.Это вызвано атрибутом execute="@this".@this в основном означает, что будет выполнен / обработан только компонент current .Если вы хотите обработать всю форму, включая все содержащиеся в ней элементы ввода, вам нужно использовать execute="@form".

<h:commandButton value="#{msg['rt.refresh']}" action="#{updateTextAction.execute}" onclick="cleanupRte();">
    <f:ajax execute="@form" render="@all" onevent="disposeTinyMce" />
</h:commandButton>

Таким образом модель будет обновлена ​​со значениями всех обработанных элементов ввода.

Или, если вы хотите обрабатывать только определенные входы, вам нужно использовать, например, execute="input"где input - идентификатор компонента ввода.Это может занять разделенную пробелами строку (относительных) идентификаторов клиента.


Что касается изобретения колеса, просто посмотрите на библиотеки компонентов.Например, PrimeFaces имеет a <p:editor> компонент .Тогда это всего лишь

<p:editor value="#{bean.text}" />
<p:commandButton value="Save" action="#{bean.save}" />

без каких-либо хлопот с пользовательскими сценариями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...