2010-10-19 17 views
27

Tôi biết những gì prependId=false thực hiện. Nó đặt cờ để id của biểu mẫu không thêm vào id của mẫu con, nhưng tại sao? bất kỳ lý do cụ thể tại sao bạn làm hoặc không muốn thêm id?JSF: Tại sao prependId = false trong biểu mẫu?

+1

liên quan: http://stackoverflow.com/questions/7415230/jsf-namingcontainer-và-uiform-với-prependid/tl; dr: chỉ không sử dụng nó, bao giờ hết. – BalusC

Trả lời

36

Theo kinh nghiệm của tôi, tôi không bao giờ sử dụng thuộc tính này. Tuy nhiên, trong một số trường hợp, nó có thể hữu ích.

Khi bạn sử dụng Facelets, bạn có thể tạo mẫu hoặc bao gồm các trang bên trong một trang khác. Vì vậy, bạn có thể tưởng tượng rằng một trang có thể được bao gồm trong một số trang khác nhau. Hãy ví dụ nơi trang mẹ chứa một form, với id khác nhau:

Trang 1:

<h:form id="form1"> 
    <ui:include src="pages/my-page.xhtml"/> 
    ... 
</h:form> 

Trang 2:

<h:form id="form2"> 
    <ui:include src="pages/my-page.xhtml"/> 
    ... 
</h:form> 

Giờ đây, trong my-page.xhtml, bạn có một số <h:inputText id="foo"/>. Trong trường hợp đầu tiên, ID thực của đầu vào sẽ là form1:foo, trong trường hợp thứ hai, ID này sẽ là form2:foo. Điều này có thể tạo ra các tình huống phức tạp nếu bạn cần truy cập trực tiếp vào thành phần này trong Javascript hoặc trong Java (sử dụng phương thức findComponent("...")).

Nếu bạn sử dụng prependId="false" (hoặc trên một số thành phần forceId="true"), ID sản sẽ được đơn giản foo, và sau đó mã của bạn sẽ đơn giản hơn vì bạn sẽ không phải quan tâm đến các container của lĩnh vực đầu vào.

Tuy nhiên, bạn sẽ phải sử dụng thuộc tính này một cách cẩn thận, như bạn có thể nhận được một lỗi ID trùng lặp nếu bạn sử dụng prepend này thuộc tính quá thường xuyên ...

+6

Đồng ý. Tuy nhiên, truy cập JS có thể được đơn giản hóa nếu bạn đang sử dụng từ khóa 'this' này một cách thông minh :) – BalusC

+0

Với prependId =" true ", id thành phần được đặt trước bằng formName. Điều này hữu ích nếu bạn có nhiều thành phần có cùng id trong hai biểu mẫu khác nhau trong cùng một tệp .xhtml. – bilelovitch

2

Một kịch bản mà chúng ta phải thiết lập cờ này là trong trường hợp Kiểm soát tự động hoàn toàn thư viện các thư viện.

Tôi phải đặt cờ này thành sai khi tôi đang cố gắng kiểm soát Tự động hoàn thành thư viện thủ đô. Tôi đã không thể nhận được tự động hoàn thành làm việc nhưng sau khi thiết lập cờ này nó làm việc tốt. Bạn có thể thấy liên kết này cho câu hỏi của tôi về vấn đề này

WARN [Parameters] Parameters: Invalid chunk ignored. warning coming in primefaces application

7

Tôi thích thêm prependId thỉnh thoảng để làm cho các yếu tố phong cách qua lớp ID của họ dễ dàng hơn. Ví dụ: một biểu mẫu:

<h:form id="myform" ... > 
    <h:inputText id="mytext" ... /> 
</h:form> 

Sẽ cấp cho bạn ID là myform:mytext. Vì dấu hai chấm được đặt trong CSS, bạn phải thoát khỏi CSS để đọc một cái gì đó như #myform\:mytext { ... } mà tôi không muốn làm. Với prependId="false" Tôi chỉ sử dụng #mytext { ... }, đơn giản hơn rất nhiều & đẹp hơn để đọc. Nó cũng đẹp hơn với các bộ tiền xử lý CSS như LESS hoặc Sass.

+5

Một giải pháp thay thế sẽ là sử dụng javax.faces.SEPARATOR_CHAR - điều này cho phép bạn sử dụng một ký tự dấu tách khác thay vì ":". – sleske

+0

Để làm rõ: @Lee Theobald rõ ràng có nghĩa là "đại tràng" khi nói "Là dấu chấm phẩy ...". –

+0

Điều đó tôi đã làm. Đã sửa câu trả lời một cách thích hợp. –

8

Trường hợp prependId = false có ích trong biểu mẫu đăng nhập, nếu bạn đang sử dụng Spring Security, vì các id của các đầu vào phải chính xác là "j_username" và "j_password". Vì vậy, bạn không nên đặt id biểu mẫu trước chúng, và sử dụng prependId = false là một lựa chọn tốt để đạt được điều này.

3

Ngoài việc làm cho bộ chọn CSS dễ dàng hơn, việc sử dụng prependId=false giúp việc sử dụng JavaScript và jQuery dễ dàng hơn để truy cập các phần tử cụ thể.

Nếu không, mà không sử dụng RichFaces, để có được một elmement bởi id sử dụng jQuery, bạn sẽ phải sử dụng một dãy thoát xấu xí như:

jQuery("form-id\\:element-id") 
+0

Sử dụng các lớp CSS giả. JSF không bao giờ sửa đổi tên lớp, vì vậy bạn có thể chỉ cần truy cập thuộc tính bằng cách sử dụng '$ (. MyClass)'. –

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