2011-12-06 12 views
12

Sử dụng Ảnh chụp PF 3.0-RC1 (11/22/2011)Làm cách nào để nhận PrimeFaces <p: selectOneMenu> gọi giá trịChangeListener?

Tôi có một thành phần hỗn hợp. Tôi muốn gọi giá trịChangeListener khi lựa chọn được thực hiện, nhưng nó dường như không gọi cho người nghe.

Đây là mã cho các thành phần:

<p:selectOneMenu style="width: 220px;" 
     value="#{customerProfileSessionBean.selectedAccount}" 
     valueChangeListener="#{customerProfileSessionBean.accountValueChange}" > 
    <f:selectItems value="#{sessionBean1.custAccountList}"/> 
</p:selectOneMenu> 

Người nghe trong đậu ủng hộ có một tuyên bố in mà không được gọi là (ít nhất là tôi không nhìn thấy nó trong nhật ký máy chủ).

Có điều gì khác mà tôi cần phải làm để có được valueChangeListener được gọi khi giá trị thay đổi không? Tôi có cần sử dụng không?

Ngoài ra, trong trình nghe, có một ValueChangeEvent được chuyển không?

Cảm ơn.

Trả lời

34

Có vẻ như bạn đang mong đợi rằng phương thức valueChangeListener ở phía máy chủ được gọi ngay lập tức khi sự kiện thay đổi xảy ra ở phía máy khách. Điều này LAF không đúng. Nó sẽ chỉ được gọi khi biểu mẫu được gửi đến máy chủ và giá trị mới không equals() giá trị cũ.

Có ít nhất hai cách để đạt được yêu cầu chức năng của bạn:

  1. Thêm onchange="submit()" để JavaScript sẽ gửi biểu mẫu bất cứ khi nào bạn thay đổi giá trị:

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}" 
        valueChangeListener="#{customerProfileSessionBean.accountValueChange}" 
        onchange="submit()"> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    Đây là tuy nhiên rất JSF -1.x-ish và kém cho trải nghiệm người dùng. Nó cũng sẽ gửi (và chuyển đổi/xác thực!) Tất cả các lĩnh vực đầu vào khác mà có thể không phải là những gì bạn muốn.

  2. Hãy sử dụng trình nghe ajax để chắc chắn nếu bạn không quan tâm đến thay đổi giá trị thực tế (nghĩa là giá trị cũ không thú vị cho bạn), nhưng bạn thực sự quan tâm đến sự kiện thay đổi. Bạn có thể làm điều này bằng <f:ajax> hoặc trong PrimeFaces linh kiện sử dụng <p:ajax>:

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}"> 
        <p:ajax listener="#{customerProfileSessionBean.accountValueChange}" /> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    Và thay thế ValueChangeEvent luận bởi đối số AjaxBehaviorEvent.

+0

Cảm ơn. Tôi đã xem xét thành phần PrimeFaces để thực hiện việc submit() như là một phần của hành vi ajax của thành phần. – Burferd

+6

Giải pháp selcond của bạn hoạt động rất tốt, nhưng chỉ khi tôi thay đổi ' devsnd

+1

BalusC là vị trí on.Even thú vị hơn, mặc dù tôi không chắc chắn nếu nó là legit., Chỉ là để chèn bên trong trình đơn và để nguyên thuộc tính valueChangeListener của trình đơn nguyên vẹn. Vì lý do nào đó ajax sẽ kích hoạt valueChangeEvent khi mục đó thay đổi. Tôi đã thử nghiệm điều này một cách toàn diện để thay đổi ngay lập tức thành một miền địa phương và nó hoạt động một giấc mơ. –

3

Add f: tuyên bố ajax cho p: selectOneMenu, nó sẽ tạo ra cuộc gọi ajax và giá trị của bạn sẽ được gửi EX:

 <p:selectOneMenu style="width: 220px;" value="# 
     {customerProfileSessionBean.selectedAccount}" 
      valueChangeListener="#{customerProfileSessionBean.accountValueChange}" > 
     <f:selectItems value="#{sessionBean1.custAccountList}"/> 
     <f:ajax render="@form"/> 
     </p:selectOneMenu> 

Hoặc bạn có thể cung cấp id bảng hoặc id DataTable, nếu bạn không muốn torender toàn bộ hình thức, như:

<f:ajax render=":formid:panelGroupId"/>