2010-01-16 29 views
8

Nếu tôi viếtTại sao Wicket thay đổi id của các phần tử html?

<form wicket:id="form" id="form> 

hoặc thậm chí

<form wicket:id="form>... 

Sau đó, HTML rendered cho thấy id 'hình thức' nối với những con số khác nhau bất cứ khi nào trang được làm mới ví dụ

<form id="form7".... 

Có cách nào để vô hiệu hóa hành vi này của khung Wicket không?

Trả lời

7

Đây là hành vi bạn muốn trong hầu hết các trường hợp khi sử dụng wicket. Id động có nghĩa là ngăn chặn các xung đột id khi các hành vi Ajax được thêm vào các thành phần hoặc thêm vào các phản hồi ajax để làm mới. Đối với bất kỳ tình huống nào trong số này, bạn thực sự cần cả phản hồi của máy khách và trạng thái phía máy chủ để được hỗ trợ. Nếu có tài nguyên js bên ngoài bạn cần id của một thành phần để tra cứu dom, thì tôi sẽ đề xuất thêm hành vi thành phần tùy chỉnh wicket mà sau đó sẽ tạo cuộc gọi js đến một hàm đi qua trong id được tạo.

Tôi nhận ra những gì tôi sẽ mô tả dẫn bạn nhiều hơn vào rừng Wicket. Nhưng tôi đã hạnh phúc hơn với những thứ ajaxy mà Wicket mở ra cho bạn ra khỏi hộp.

+0

nó là một chuẩn Wicket để viết ngay cả Javascript trong các tệp Java? –

+0

Giống như mọi thứ khác không may, nó phụ thuộc. Có các ví dụ cho các thư viện JS (ví dụ wicket-ajax.js) và tạo JS từ bên trong java. Mã nguồn Wicket nên có các ví dụ về cả hai. Cuối cùng, về bất kỳ hành vi ajax chuẩn nào tại một thời điểm nào đó sẽ bao gồm một người đóng góp tiêu đề chuẩn để bao gồm tệp wicket-ajax.js.Kiểm tra một số thành phần ajax để xem JS được tạo ra sẽ có một phương thức js được tạo ra hoặc một cái gì đó để đính kèm vào thành phần mà nó được thêm vào. – Matt

+0

@Monis: Tôi thích đặt số lượng * tối thiểu * của JS trong mã Java, thường chỉ là một cuộc gọi đến một hàm trong tệp .js riêng biệt. [Một ví dụ] (http://stackoverflow.com/a/8848464/56285). – Jonik

0

Nó đã được một thời gian kể từ khi tôi làm việc với Wicket, nhưng tôi nhớ rằng khi wicket sử dụng các yếu tố ajax, id s của nó là tự động tạo ra (các id của thẻ, không phải là wicket:id). Bạn có thể kiểm soát id của thẻ khi không sử dụng và phần tử ajax. Trong trường hợp của bạn, vì không có mã, tôi đoán bạn sẽ phải thay đổi bất kỳ AjaxButton hoặc Ajax* nào từ biểu mẫu của bạn.

+0

Các vấn đề tôi đang gặp phải với các id thay đổi này là ở phía máy khách, như css của tôi không thể sử dụng các id này để ánh xạ các kiểu, tôi không thể viết javascript được phát với id phần tử. –

+1

@Monis Iqbal Bạn đang sử dụng trực tiếp các móc Ajax của Wicket. – Esko

+0

có nghĩa là tôi không thể viết javascript tùy chỉnh? Đây có phải là vi phạm SOC mà Wicket hỗ trợ không? vì javascript được cho là phía máy khách. –

3

Đây là tính năng Wicket desing. Bạn có thể sử dụng lớp để liên kết kiểu và thành phần.

<form wicket:id="form" id="form> 

Bạn cũng có thể thử (tôi chưa bao giờ làm) setMarkupId. Tôi không chắc chắn rằng nó là cách tốt.

+0

setMarkupId không hoạt động. –

+1

setMarkupId là cách làm thế nào để làm điều đó thấy câu trả lời của tôi dưới đây –

+0

oh, xin lỗi. Tôi đã đọc sai nó như setOutputMarkupId (true). Xin lỗi @leonidv. và cảm ơn @Michal –

18

Chúng tôi đặt id đánh dấu bằng tay rộng rãi trong dự án của chúng tôi để giảm bớt thử nghiệm tự động với khung kiểm tra Selenium. Nó chắc chắn hoạt động.

Component.setOutputMarkupId(true); // write id attribute of element to html 
Component.setMarkupId("someid"); // id attribute of element is "someid" 
0

Có bạn có thể viết JavaScript tùy chỉnh ... bạn chỉ cần triển khai theo cách 'Wicket'. Bạn có thể trang trí các thành phần, các cuộc gọi Ajax, v.v. với JavaScript tùy chỉnh, sau đó tất cả đều phát độc đáo.

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