2012-03-25 23 views
8

Tôi đang cố gắng cập nhật thành phần chính từ sự kiện thành phần hỗn hợp bằng cách sử dụng f:ajax.Thành phần tổng hợp JSF <f:ajax> chứa id không xác định - không thể định vị nó trong ngữ cảnh của thành phần

Các thành phần hỗn hợp là ở đây:

<cc:interface> 
    <cc:attribute name="update" /> 
    <cc:attribute name="customid" required="true"/> 
    <cc:attribute name="val" required="true"/> 
    <cc:attribute name="selectedvalue" required="true"/> 
</cc:interface> 
<cc:implementation> 
    <h:panelGrid columns="2" style="font-size: 10px" > 
     <p:selectOneMenu id="#{cc.attrs.customid} value="#{cc.attrs.selectedvalue}"> 
      <f:selectItems value="#{cc.attrs.val}"/> 
      <f:ajax event="change" render="#{cc.attrs.update" /> 
     </p:selectOneMenu> 
     <p:commandButton type="button" icon="ui-icon-plus" onclick="dlg.show();" /> 
    </h:panelGrid> 
</cc:implementation> 

Bây giờ khi sử dụng thành phần này như sau:

<h:form> 
    <ez:combo customid="make" val="#{vehicleBean.makes}" selectedvalue="#vehicleBean.vehicle.make}" update="model" /> 
    <p:selectOneMenu id="model" value="#{vehicleBean.vehicle.model}"> 
     <f:selectItems value="#{vehicleBean.models}" /> 
    </p:selectOneMenu> 
</h:form> 

tôi nhận được lỗi sau:

chứa id chưa biết 'mô hình' - không thể xác định vị trí trong ngữ cảnh của thành phần, tạo

+0

không phải là sai (thiếu}) – lu4242

Trả lời

15

Kể từ khi compone nt để cập nhật nằm ngoài cc bạn phải giải quyết nó theo một cách khác. Đầu tiên cho hình thức của bạn một id:

<h:form id="myform"> 

Sau đó giải quyết các mục tiêu thành phần từ cc của bạn như thế này:

render=":myform:model" 

Thông báo đại tràng dấu cho phép JSF tìm kiếm các thuộc tính từ gốc tài liệu.

+0

Vẫn không thể tìm thấy .. chứa id không xác định ': myform: model ' –

+1

Kiểm tra nguồn html được tạo trong trình duyệt để tìm đúng id. Có thể bạn có một NamingContainer khác trong cây tài liệu mà bạn không hiển thị trong câu hỏi –

+0

Cảm ơn Matt nó hoạt động. –

4

Tôi đã có cùng một vấn đề trong khi trước đây, chỉ để biết thông tin, tôi đã kiểm tra các nguồn thực hiện của mojara jsf; ở đây là làm thế nào nó dường như làm việc: Lớp ajaxBehaviorRendered, khi gặp một f : ajax yếu tố để render, phân tích nội dung của làm thuộc tính thông qua phương pháp của nó getResolvedId:


private static String getResolvedId(UIComponent component, String id) { 

     UIComponent resolvedComponent = component.findComponent(id); 
     if (resolvedComponent == null) { 
... 

Vấn đề là các phương thức findComponent: cái này cần cơ sở thành phần cơ bản như là một điểm phân tầng để tìm kiếm trong cây thành phần. Nếu từ định danh bắt đầu bằng char ":", cơ sở thành phần là viewRoot.



    UIComponent base = this; 
    if (expr.charAt(0) == sepChar) { 
     // Absolute searches start at the root of the tree 
     while (base.getParent() != null) { 
      base = base.getParent(); 
     } 
     expr = expr.substring(1); 
    } 

Thành phần cơ sở khác là thành phần cha mẹ gần nhất của loại NamingContainer (nghĩa là thành phần tổng hợp của bạn, nơi bạn xác định thành phần ajax).



    //Treat remainder of the expression as relative 
    else if (!(base instanceof NamingContainer)) { 
     // Relative expressions start at the closest NamingContainer or root 
     while (base.getParent() != null) { 
      if (base instanceof NamingContainer) { 
       break; 
      } 
      base = base.getParent(); 
     } 
    } 

Sau đó, trong cả hai trường hợp, nó bắt đầu tìm kiếm thành phần có từ định danh đã cho từ khởi đầu này.

Hành vi này là hành vi được chỉ định từ jsf. Theo quan điểm của tôi, nếu bạn cần tham khảo một thành phần bên ngoài hỗn hợp, bạn phải xác định tên đầy đủ, sử dụng tiền tố ':' theo sau là thuộc tính 'cc.clientId'.

+0

Rất intersting điểm, cảm ơn bạn. BTW, tại sao chúng ta không thể chỉ định thuộc tính render là ': client_id' ommiting id biểu mẫu gốc? –

+0

Tôi đã không làm việc với JSF kể từ 2 năm nay, tôi hy vọng tôi sẽ không trả lời điều gì ngớ ngẩn. Từ những gì tôi nhớ (nhưng tôi không thực sự chắc chắn), vòng đời JSF, khi nó xử lý cây thành phần và tìm một thành phần bên trong một biểu mẫu, tự động thêm tiền tố của thành phần này với định danh của biểu mẫu. Do đó, nó không thể giải quyết ": client_id" vì nó định danh thực là "form_id: client_id". Nhưng nó cần được xem xét khi tôi mất tập trung vào JSF trong 2 năm qua. –

+0

Vì vậy, có, thuật toán thành phầnSEarch cần đường dẫn đầy đủ đến một thành phần. Bạn không biết đó có phải là một điều đặc biệt cho việc thực hiện Mojarra không? –

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