第二次提交时TinyMCE在bean中的值(使用jsf.ajax.addOnEvent)

时间:2013-05-09 21:13:35

标签: ajax jsf jsf-2 tinymce

我已经建立了一个基本的测试用例,其中我遇到了一些(对我而言)奇怪的行为。使用下面的设置时,编辑器中的输入值只能在第二次提交时由h:outputText显示。 E.g。

  • 将编辑器中的值更改为“myvalue”
  • 发送Ajax-request
  • h:outputText显示“test”(bean的默认值)
  • 将编辑器中的值更改为“anothervalue”
  • 发送Ajax-request
  • h:outputText显示“myvalue”
  • 发送Ajax-request
  • h:outputText显示“anothervalue”

注意:有一个自定义复合,如果需要请询问代码(它只是为TinyMCE创建textarea并从下面加载.js文件)

的index.xhtml

<h:body>
    <h:form>
        <mh:editor id="tinymceEditor" 
                   value="#{bean.value}" />
        <h:commandButton value="Ajax">
            <f:ajax execute="tinymceEditor" 
                    render="show" />
        </h:commandButton>
        <h:outputText id="show" value="#{bean.value}" />
    </h:form>
</h:body>

jsfhandler.js - &gt;包含在自定义合成mh:editor

中的标题中
jsf.ajax.addOnEvent(function(data) {
    switch(data.status) {
        case "begin":
            tinyMCE.execCommand('mceRemoveControl',true,"tinymceEditor");
            tinyMCE.triggerSave();
            break;

        case "complete":
            tinyMCE.execCommand('mceAddControl',true,"tinymceEditor");
            break;

        case "success":            
            break;
    }
});

Bean.java

@Named
@RequestScoped
public class Bean {
    private String value = "test";
}

1 个答案:

答案 0 :(得分:2)

为了将表单数据的更改考虑在内,JSF ajax begin事件为时已晚。在此事件之前,已根据表单数据准备了ajax请求。

实际上,顺序如下:

  • 用户输入输入(并留下字段)。
  • HTML DOM“更改”事件在输入字段上触发。
  • 用户点击提交按钮。
  • HTML DOM“点击”事件在提交按钮上触发。
  • JSF准备ajax请求。
  • JSF ajax“begin”事件是在ajax请求上触发的。
  • JSF发送ajax请求。
  • ...

基本上,您应该在HTML DOM“点击”事件期间执行tinyMCE.triggerSave()

<h:commandButton ... onclick="tinyMCE.triggerSave()">

或者,更好的是,在tinyMCE textarea的HTML DOM“更改”事件期间。