2012-01-16 24 views
7

Tôi đang cố gắng để xây dựng một bố cục chung trang với một div nội dung chính và một sidebar với Play framework:Rendering Sidebar sử dụng Play Khung

<html> 
<head></head> 
<body> 
<div id="all"> 
    <div id="content">the ususal doLayout stuff</div> 
    <div id="sidebar"> 
    <div class="widget">Recent comments...</div> 
    <div class="widget">Recent posts...</div> 
    other Widgets... 
    </div> 
</div> 
</body> 
</html> 

Có thể làm cho các widget trong sidebar mà không liên kết phòng ngừa nội dung của các widget trong mỗi bộ điều khiển? Ngay cả khi không có tiện ích như vậy trong mẫu, tôi sẽ phải nhận tất cả dữ liệu cần thiết.

Gần đây, tôi đã sử dụng Lift Framework và có thể viết chỉ <div class="lift:someWidget.news">. Điều này gọi phương thức news trong lớp someWidget để hiển thị tiện ích. Có thể lấy dữ liệu từ cơ sở dữ liệu trong phương thức đó, vì vậy không cần thiết phải ràng buộc phòng ngừa. Có điều gì đó tương tự trong Play để lưu các truy vấn DB không cần thiết và mã không liên quan trong bộ điều khiển không?

Trả lời

5

Có. Đây là hai lựa chọn ưa thích của tôi. Tùy chọn phù hợp phụ thuộc vào trường hợp sử dụng cụ thể của bạn.

Lựa chọn 1 - Sử dụng các ký hiệu @before

Bằng việc sử dụng chú thích @before, bạn có thể thực hiện chế biến phổ biến trên mỗi hành động đó được gọi. Nó sẽ thực hiện phương thức trước khi thực hiện hành động chính, cho phép bạn lưu trữ dữ liệu của mình trong bản đồ renderArgs, có sẵn trong chế độ xem.

Dữ liệu này trong chế độ xem có thể được truy cập trong mẫu chính của bạn và do đó có sẵn trong tất cả các chế độ xem.

Lựa chọn 2 - Sử dụng AJAX

Đặt một vài divs như placeholders như bạn đã làm trong ví dụ của bạn, và sau đó sử dụng tải JQuery rằng sẽ gọi một hành động trên serverside của bạn để tạo ra một mảnh nhỏ của HTML chỉ dành riêng cho đoạn mã bạn yêu cầu.

2

Bạn có thể gọi phương thức bộ điều khiển tĩnh từ mẫu. Lưu ý @Util - Chú nói chơi rằng đây không có nghĩa là một hành động - Phương pháp:

@Util 
public static List<Post> getPosts() { 
    ... 
} 

Sau đó gọi đây là từ mẫu của bạn (có lẽ một thẻ tùy chỉnh):

<div class="widget"> 
%{ 
    def posts=controllers.Post.getPosts() 

    for(post in posts) { 
    }% 
     <h2>${post.header}</h2> 
     <p>${post.body}</p> 
    %{ 
    } 
}% 
</div> 

Vì đây là vi phạm các mẫu MVC tinh khiết tôi sẽ không khuyên bạn nên sử dụng này rất nhiều. Nhưng được sử dụng một cách khôn ngoan nó có thể là một giải pháp thực tế. Và trường hợp sử dụng của bạn để tạo thanh bên trong bố cục chung là sử dụng hoàn toàn hợp lệ (theo ý kiến ​​của tôi) - nếu sau này bạn quyết định cung cấp biểu diễn json dữ liệu của bạn trong nội dung chính, thanh bên bố cục không được sử dụng - và do đó dữ liệu không được tìm nạp khi sử dụng mẫu này.

+0

Câu trả lời rất hữu ích, cảm ơn! – Dave

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