2012-05-18 20 views
6

Tôi đến với hành vi lạ của ứng dụng của tôi. Các nút lệnh bắt đầu gọi hành động vào lần truy cập thứ hai. Ngày đầu tiên - không có gì xảy ra. Nó có hiệu lực trên firefox và chromium, nhưng trong epiphany hoạt động như bình thường.Các nút lệnh gọi các hành động trên lần đẩy thứ hai (jsf)

môi trường của tôi: - ubuntu 11.04 - glassfish 3.1.1 - JSF 2.X - primefaces 3.2 - firefox 12.0 - hiển linh 2.30.6

Mã dụ:

<ui:define name="content"> 
     <h:form id="form"> 
      <h:panelGrid id="panelGrid" columns="3"> 

       <h:outputText value="#{msg.fieUserName}:"/> 
       <h:inputText id="name" value="#{userBb.editedUser.username}" /> 
       <h:message for="name" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fieUserDescription}:"/> 
       <h:inputText id="description" value="#{userBb.editedUser.description}" /> 
       <h:message for="description" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fieUserPassword}:"/> 
       <h:inputSecret id="password" value="#{userBb.editedUser.password}" redisplay="true"/> 
       <h:message  for="password" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fieUserRights}:"/> 
       <p:selectOneMenu id=  "rights" 
           value= "#{userBb.editedUserGroup}" 
           converter="#{pGroupOfUsersConverter}"> 
        <f:selectItems 
         value ="#{groupDao.findAll()}" 
         var  ="row" 
         itemLabel="#{groupDao.rightsDescription(row.id)}" 
         itemValue="#{row.groupname}" 
         > 
        </f:selectItems> 
       </p:selectOneMenu> 
       <h:message for="rights" styleClass="error_msg"/> 

       <h:outputText value="#{msg.fiePorofolioName}:" rendered="#{userBb.chosenNew}"/> 
       <h:inputText id="portName" value="#{userBb.portfelForNewUser.nazwa}" rendered="#{userBb.chosenNew}"> 
        <f:validateBean disabled="true" /> 
       </h:inputText> 
       <h:message for="portName" styleClass="error_msg" rendered="#{userBb.chosenNew}"/> 

       <h:outputText value="#{msg.fiePotofolioCurrency}:" rendered="#{userBb.chosenNew}"/> 
       <p:selectOneMenu id=  "waldep" 
           value= "#{userBb.portfelForNewUser.walutaDepozytowa}" 
           converter="#{igConverter}" 
           rendered= "#{userBb.chosenNew}" 
           > 
        <f:selectItems value= "#{igDao.waluty}" 
            var=  "row" 
            itemLabel="#{row.nazwa}"/> 
       </p:selectOneMenu> 
       <h:message for="waldep" styleClass="error_msg" rendered="#{userBb.chosenNew}"/> 

      </h:panelGrid> 
      <h:panelGrid columns="2"> 
       <h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}" /> 
       <h:commandButton value="#{msg.butSave}" action="#{userBb.formEdit()}" rendered="#{!userBb.chosenNew}"/> 
       <h:commandButton value="#{msg.butBack}" action="#{userBb.formBack()}"/> 
      </h:panelGrid> 
     </h:form> 
    </ui:define> 

Trong phương thức ví dụ này, userBb.formCreate() chỉ được gọi khi nhấp vào nút lệnh thứ hai mặc dù nút được hiển thị. Khi các trường không được điền chính xác hơn các thông điệp thích hợp xuất hiện bên cạnh chúng, nhưng ... chỉ trên nhấp chuột thứ hai! Lời khuyên nào?

Tôi kiểm tra các điểm từ: this advice, nhưng không tìm thấy giải pháp.

+0

Bạn có chắc chắn 100% rằng nó không phải là điểm 5.. và 7 của câu trả lời đó? Bạn đã không rõ ràng disproven rằng trong mã của bạn – BalusC

+0

Tôi đã kiểm tra nó ra.Đầu tiên tôi đảm bảo rằng kết xuất thuộc tính là ok, và tôi đặt nó bổ sung trong @PostConstruct init(). của biểu mẫu cho userForm và được thêm vào nút lệnh Vẫn hoạt động đối với hành động thứ hai trong firefox và chromium và lần đầu tiên trong ephipany. Tôi sẽ cố gắng tìm hiểu, có lẽ tôi đã làm điều gì sai – Zbyszek

Trả lời

7

Ok, tôi đã tìm thấy những gì đã xảy ra. Vì vậy:

Hình thức của vấn đề: Tôi có một trang cho dữ liệu người dùng. Một số mục nhập và các nút lệnh. Khi nhấp vào nút "Tạo", dữ liệu đầu vào sẽ được kiểm tra. Nếu dữ liệu là người dùng ok được tạo và bảng người dùng xuất hiện hoặc khi có lỗi - thông báo lỗi xuất hiện và người dùng ở trên cùng một trang: enter image description here

Tôi đã tìm thấy một số hành vi thất thường. Không có gì xảy ra trong lần nhấp đầu tiên (hành động), chỉ các hành động thứ hai và sau đó mới có hiệu lực. Nhưng. Hành vi này là liên quan đến đối với loại trình duyệt web mà tôi sử dụng.

Tất cả các hành động diễn ra từ lần nhấp đầu tiên, trong trình duyệt web: hiển thị và konqueror. Mặc dù trong firefox và crom tôi quan sát hành vi thất thường này mà tôi đã mô tả ở trên. Mã cho nút lệnh là:

<h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}"/> 

Các hành vi khác nhau trong các trình duyệt web khác nhau.

Nguyên nhân. Nguyên nhân được liệt kê bởi @Balusc trong số note của tôi, lần đầu tiên tôi đọc. Nó thực sự là pt. 7.

Giải pháp. Tôi đã cố gắng để thay đổi khai nút theo cách này:

<h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}"> 
    <f:ajax render="userForm"/> 
</h:commandButton> 

nơi UserForm là id đúng h: form. Không có kết quả nào, chỉ những nhấp chuột thứ hai và tiếp theo mới có hiệu lực - hiển thị thông báo lỗi.

Vì vậy, tôi đã thay đổi nút lệnh tuyên bố từ trang trước, đã gọi trang hành vi thất thường. Ban đầu nó là:

<p:commandButton value="#{msg.butNew}" action="#{userBb.actionNew()}"/> 

nút lệnh thủ đô. Và đó là nó, như Balusc đã viết: "Nếu một phụ huynh của với nút UICommand là trả lại/cập nhật bởi một yêu cầu ajax trước, thì hành động đầu tiên sẽ luôn thất bại."

Vì vậy, tôi đã thay đổi khai để:

<p:commandButton value="#{msg.butNew}" action="#{userBb.actionNew()}" ajax="false"/> 

Và đó là nó Nó hoạt động tốt trong bất kỳ trình duyệt, cho hành động đầu tiên

Các vấn đề liên quan