2012-05-27 35 views
23

Nó xảy ra trước đây rằng ui:decorate có chức năng giống như ui:include ngoại trừ việc bạn cũng có thể vượt qua ui:paramui:define vào tệp được bao gồm.Sự khác biệt khái niệm thực sự giữa ui: trang trí và ui: bao gồm là gì?

Tôi có bị điên không?

EDIT: Mặc dù trong thực tế, bạn có thể vượt qua ui:param vào một tập tin ui:include quá, nó quay ra tôi đã làm việc đó. Có lẽ bạn cũng có thể vượt qua một số ui:define, tôi sẽ kiểm tra và chỉnh sửa tại đây.

+0

Tôi không chắc liệu tôi có hiểu vấn đề cụ thể của bạn hay không. Vì vậy, tôi muốn nói, có bạn đang điên :) – BalusC

+0

@ BalusC Tôi thực sự có thể bị điên, nhưng tôi không nói một vấn đề cụ thể, chỉ là một nguyên tắc chung. Tôi đã cố gắng tìm ra sự khác biệt thực sự tồn tại giữa hai cấu trúc này và tôi không thể tìm thấy bất kỳ thứ gì. Có thể ui: include không hỗ trợ ui: define, tôi đã gặp phải các vấn đề khác trong khi kiểm tra. – EJP

+0

Ah bạn chỉ hỏi về sự khác biệt về khái niệm? – BalusC

Trả lời

41

Sự khác biệt chính giữa <ui:include><ui:decorate><ui:decorate> được thiết kế để cho phép chèn các thành phần mẫu do người dùng định nghĩa, trong khi <ui:include> được thiết kế để bao gồm một mẫu hiện tại và đã-được xác định trước.

Điều này thực sự có nghĩa là <ui:decorate> hỗ trợ <ui:define> cho các thành phần mẫu do người dùng xác định trong phần thân và có thể chèn nó ở vị trí <ui:insert> bên trong mẫu.

Dưới đây là một ví dụ clumsy- -somewhat để hiển thị nơi nó có thể được sử dụng:

/WEB-INF/templates/field.xhtml

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
> 
    <h:outputLabel for="#{id}" value="#{label}" /> 
    <ui:insert name="input" /> 
    <h:message id="#{id}_message" for="#{id}" /> 
</ui:composition> 

/page.xhtml

<h:panelGrid columns="3"> 
    <ui:decorate template="/WEB-INF/templates/field.xhtml"> 
     <ui:param name="label" value="Foo" /> 
     <ui:param name="id" value="foo" /> 
     <ui:define name="input"> 
      <h:inputText id="foo" value="#{bean.foo}" required="true" /> 
     </ui:define> 
    </ui:decorate> 
    <ui:decorate template="/WEB-INF/templates/field.xhtml"> 
     <ui:param name="label" value="Bar" /> 
     <ui:param name="id" value="bar" /> 
     <ui:define name="input"> 
      <h:selectBooleanCheckbox id="bar" value="#{bean.bar}" required="true" /> 
     </ui:define> 
    </ui:decorate> 
    ... 
</h:panelGrid> 

Lưu ý rằng nó ám chỉ rằng các thành phần độc đáo trong mỗi tế bào của lưới bảng điều khiển. Một lần nữa, ví dụ cụ thể này là khá vụng về, tôi chỉ sử dụng một số tag file thay thế. Chỉ khi đó là phần lớn hơn, ví dụ: một dạng toàn bộ, ví dụ: đầu trang hoặc chân trang của nó phải có thể tùy chỉnh, khi đó, <ui:decorate> sẽ phù hợp.

Một lợi thế lớn khác của <ui:decorate> là nó cho phép bạn sử dụng thành phần tổng hợp với mẫu. Xem thêm Is it possible to use template with composite component in JSF 2?

+3

Tôi không hiểu sự khác biệt giữa 'thành phần mẫu do người dùng xác định' và 'mẫu hiện tại và được xác định trước'. – EJP

+0

Trong ví dụ '/ page.xhtml' đã cho,' 'là nơi người dùng cuối có thể xác định các thành phần mẫu biến. – BalusC

+0

Tôi hiểu rằng một phần, tôi chỉ không hiểu sự khác biệt mà bạn đang vẽ. – EJP

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