2013-05-09 35 views
2

我已經設置了一個基本的測試用例,其中我遇到了一些(對我來說)奇怪的行爲。使用下面的設置時,編輯器中的輸入值只有在第二次提交時才能被h:outputText看到。例如。在編輯TinyMCE在第二次提交時使用bean的值(使用jsf.ajax.addOnEvent)

  • 變化值設置爲 「myvalue的」
  • 發送Ajax的請求
  • H:的outputText顯示 「測試」(來自豆默認值)編輯
  • 變化值設置爲 「anothervalue」
  • 發送Ajax的請求
  • H:的outputText顯示 「myvalue的」
  • 發送Ajax的請求
  • H:的outputText顯示「anothervalue」

注:有一個定製的複合材料,如有需要,請索要代碼

的index.xhtml(它只是從下面的TinyMCE和負載.js文件創建文本域)

<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 - >包含在定製複合MH頭:編輯

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"; 
} 

回答

2

的JSF AJAX begin事件是爲時已晚,以採取表單數據的變化考慮在內。 ajax請求已根據表單數據在此事件之前準備好。

有效地,序列如下:

  • 用戶輸入的輸入(並保留字段)。
  • 在輸入字段上觸發HTML DOM「更改」事件。
  • 用戶點擊提交按鈕。
  • 在提交按鈕上觸發HTML DOM「點擊」事件。
  • JSF準備ajax請求。
  • JSF ajax「begin」事件在ajax請求上被觸發。
  • JSF發送ajax請求。
  • ...

基本上,你應該在HTML DOM 「click」 事件期間做tinyMCE.triggerSave()

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

或者,更好的是,在tinyMCE textarea的HTML DOM「更改」事件期間。

+0

我試圖避免提交上的任何onclick事件。儘管我可以嘗試在textarea本身上使用更改事件。謝謝,JSF在幕後工作的方式隨着我需要實現的每個功能(以及您經常提供的答案)變得更加清晰。 – Aquillo 2013-05-10 12:44:39

+0

不客氣:) – BalusC 2013-05-10 12:45:05

相關問題