2012-06-14 12 views
10

Tôi muốn làm cho trang Jade của tôi mở rộng các bố trí khác nhau, tùy thuộc vào điều kiện. Vì vậy, mã của tôi trông giống như sau:nodejs ngọc có điều kiện mở rộng

if myConditionVariable 
    extends layout1 
else 
    extends layout2 
block content 
    p here goes my content! 

Bây giờ điều này không có tác dụng. Có vẻ như chỉ những lần mở rộng được xác định cuối cùng mới được tôn trọng, bất kể điều kiện. Tôi cũng đã cố gắng tự động định TEMPLATENAME, chẳng hạn như

extends myLayoutNameVariable 

và thiết lập myLayoutNameVariable trong cách cư xử khác nhau (thể hiện chức năng helper năng động, thiết lập nó như var, var địa phương vv ...)

Có khác giải pháp cho bố trí có điều kiện hoặc ai đó có thể cho tôi biết những gì tôi đang làm sai?

Chúc mừng, simon

+0

Ý của bạn là '- nếu myConditionVariable' - thấy dấu trừ ở trước' if'? (Tương tự với 'else' branch.) Ngoài ra, bạn có thể có nghĩa là' append block' hoặc cái gì đó. – elmigranto

Trả lời

7

Đây có vẻ là sự cố vẫn mở trên github.

+0

cảm ơn gợi ý! Dường như cũng vậy, vì các bố trí và bao gồm được giải quyết tại thời gian biên dịch, không phải thời gian chạy. – cmonsqpr

0

Bạn có thể làm điều gì đó như:

if myConditionVariable 
    p test 

?

Nếu không, bạn có vượt qua myConditionVariable đúng khi bạn yêu cầu hiển thị chế độ xem đó không? Một ví dụ ngắn cho việc này:

app.get "/", (req, res) -> 
    res.render "index", 
    myConditionVariable: true 
+0

Anh ấy đang truyền chính xác. Nếu không, sẽ có lỗi nói 'myConditionVariable not defined'. – elmigranto

11

Vì vậy, cách ít xâm nhập để giải quyết vấn đề này là thay đổi bố cục.

tôi đã thêm một chút middleware, và phần còn lại chảy ..

app.use(function(req, res, next){ 
    res.locals.isAjax = req.headers['x-requested-with'] && 
     req.headers['x-requested-with'] === 'XMLHttpRequest'; 
    next(); 
}); 

Bây giờ này được thiết lập, "isAjax" có sẵn để ngọc bích.

Trong "layout.jade" của tôi (mẫu bạn sẽ mở rộng từ), tôi làm điều này:

- if(!isAjax) 
    doctype 5 
    html 
     head 
     body 
     block content 
     block scripts 
- else 
    block content 
    block scripts 

Tôi đã tước ra các yếu tố khác của toàn bộ layout.jade cho (hy vọng) trong trẻo.

Cuối cùng, chế độ xem bình thường của tôi mở rộng layout.jade mà không sửa đổi (mẫu ngọc này bao gồm cả hai trường hợp).

extends layout.jade 
    .container. 
    This is text will be wrapped for a non-ajax request, 
    but not for an ajax request. 
+0

Điều này có ảnh hưởng đến hiệu suất không? Khi tôi nhìn vào vấn đề trên github liên kết ở trên nó có vẻ như TJ nói Express sẽ không cache các trang. Xin lỗi để đưa ra một câu hỏi cũ từ người chết. – mshindal

+1

@mshindal - Tôi không chắc chắn làm thế nào để trả lời câu hỏi của bạn, thực sự có nhiều phần: 1) Trình biên dịch JADE xảy ra giống như trước, nhiều mã mẫu hơn, nhưng không thực sự là một tác động lớn. 2) Tùy thuộc vào cách bộ nhớ đệm được cấu hình, nếu bạn đang sử dụng ETags, bạn sẽ cần phải tính toán cho tiêu đề này trong việc tạo ra etag, nhưng thành thật mà nói, tôi nghĩ giải pháp này là trực giao cho các vấn đề về bộ nhớ đệm. Vì vậy, .. câu trả lời của tôi sẽ là "không, nó không ảnh hưởng đến hiệu suất" –

+0

Chỉ cần bạn biết, thể hiện exposes 'req.xhr' mà kiểm tra cho' x-yêu cầu-với' tiêu đề cho bạn;) – Chev

3

Tôi hy vọng nó không quá muộn nhưng tôi chạy qua vấn đề này và tôi nghĩ rằng tôi đã tìm ra một cách giải quyết:

  1. Thực hiện một layout.jade rằng conditionaly bao gồm cả bố trí:

    layout.jade: 
    
    if conditionalVariable 
        include firstLayout.jade 
    else 
        include otherLayout 
    
  2. Trong chế độ xem của bạn, hãy mở rộng layout.jade và xác định conditionalVariable trong bộ điều khiển (true/false):

    view.jade: 
    
    extends layout 
    
    block content 
        p here goes my content! 
    
  3. Disco!

+0

Điều gì về mở rộng, tôi đã cố gắng mở rộng firstLayout nhưng nó không hoạt động –

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