2014-01-28 1 views
0
<h:form prependId="false" id="vt_sel_form"> 
     <p:panelGrid styleClass="center" columns="2">      
         <p:commandButton value="GO" oncomplete="alert(#{test.i})" actionListener="#{test.testfxn()}" update="@this"/> 
     </p:panelGrid> 
    </h:form> 

import java.io.Serializable; 
    import javax.faces.bean.ManagedBean; 
    import javax.faces.bean.ViewScoped; 

    @ViewScoped 
    @ManagedBean(name = "test") 

    public class TestClass implements Serializable { 

     int i ; 

     public int getI() { 
      return i; 
     } 

     public void setI(int i) { 
      this.i = i; 
     } 

     public void testfxn() {   
      setI(i++); 
      //i=i+10; 
      System.out.println("i" + i); 
     } 
    } 

Здесь оповещения (# {test.i}) всегда отображая 0. Как я получить поддержку значения боба, который изменяется, когда я нажимаю CommandButton. Он работает, когда я дважды нажимаю кнопку. Он работал нормально, когда использовал a4j: commandButton.Использование резервного значения боба в JavaScript

ответ

1

Это просто потому, что alert(#{test.i}); оценивается, когда commandButton является rendered. Вы можете увидеть измененное значение, говоря JSF, чтобы сделать сценарий еще раз:

<h:commandButton value="click me" action="#{testClass.testfxn()}"> 
    <f:ajax render="out" /> 
</h:commandButton> 
<h:panelGroup id="out"> 
    <h:outputScript> 
     alert(#{testClass.i}); 
    </h:outputScript> 
</h:panelGroup> 
+0

Я использовал OnComplete. Разве этого недостаточно? – kinkajou

+0

'oncomplete' отображается при визуализации представления. Это время, когда оценивается ваш '# {test.i}'. Он не будет обновляться после завершения запроса ajax. Поэтому вам нужно сообщить JSF о том, что вы где-то обновили 'i' (возможно, он отображает скрытый ввод, который вы можете прочитать из функции« oncomplete »). – mabi

+0

Как мне изменить в реальном времени. Я сделал это с richfaces, он работал нормально. Тогда, когда я сделал это с помощью правлений, это не сработало. – kinkajou

0

В отличие от RichFaces, где вы можете непосредственно вызвать функцию JavaScript, к primefaces вам нужно иметь функцию яваскрипта как:

function_name(xhr, status, args)

Использование перечисленных CommandButton в качестве примера:

<p:commandButton value="GO" oncomplete="alert(#{test.i})" actionListener="#{test.testfxn()}" update="@this"/> 

В функции test.testfxn() мы имеем:

public void testfxn(){  
RequestContext reqCtx = RequestContext.getCurrentInstance(); 
     i = i++; 
     reqCtx.addCallbackParam("i", i); 
} 

Здесь, в вызове функции резервного боба от ActionListener переменных добавляются RequestContext.

Теперь в функции JavaScript:

function draw(xhr, status, args) { 
    console.log("We are into draw function"); 
    jsonString = JSON.parse(args.i); //json variable is taken out from args variable. 
    console.log("The value of i "+ i); 
} 
Смежные вопросы