2008-11-20 24 views
135

Tôi có mẫu Freemarker chứa một loạt trình giữ chỗ cho các giá trị được cung cấp khi mẫu được xử lý. Tôi muốn có điều kiện bao gồm một phần của mẫu nếu biến userName được cung cấp, một cái gì đó như:Cách kiểm tra xem biến có tồn tại trong mẫu FreeMarker không?

[#if_exists userName] 
    Hi ${userName}, How are you? 
[/#if_exists] 

Tuy nhiên, hướng dẫn Freemarker dường như chỉ ra rằng if_exists bị phản đối, nhưng tôi không thể tìm thấy một cách khác để đạt được điều này . Tất nhiên, tôi có thể đơn giản cung cấp thêm một isUserName biến boolean và sử dụng như thế này:

[#if isUserName] 
    Hi ${userName}, How are you? 
[/#if] 

Nhưng nếu có một cách để kiểm tra xem userName tồn tại sau đó tôi có thể tránh thêm biến thêm này.

Trả lời

227
[#if userName??] 
    Hi ${userName}, How are you? 
[/#if] 

Hoặc với cú pháp Freemarker tiêu chuẩn:

<#if userName??> 
    Hi ${userName}, How are you? 
</#if> 
+1

Trong trường hợp bất kỳ ai khác bị loại bỏ, cú pháp #if phải được bao quanh bởi ít hơn và lớn hơn ký tự thay vì dấu ngoặc vuông. ví dụ: <#if userName ??> – Cameron

+0

Nó thực sự có thể sử dụng cú pháp này, vì vậy tôi chỉ cần làm theo cú pháp của câu hỏi: xem http://freemarker.sourceforge.net/docs/dgui_misc_alternativesyntax.html –

+9

Chỉ này kiểm tra xem var có tồn tại không. Nhưng nếu bạn có một chuỗi rỗng trong "userName", <#if userName ??> sẽ trả về true !! Xem câu trả lời @ user1546081 trên trang này để giải quyết vấn đề này. –

55

Ngoài ra tôi nghĩ if_exists đã được sử dụng như:

Hi ${userName?if_exists}, How are you? 

mà sẽ không phá vỡ nếu userName là null, kết quả nếu null sẽ là:

Hi , How are you? 

if_exists hiện không được chấp nhận và đã được thay thế bằng toán tử mặc định! như trong

Hi ${userName!}, How are you? 

các nhà điều hành mặc định cũng hỗ trợ một giá trị mặc định, chẳng hạn như:

Hi ${userName!"John Doe"}, How are you? 
+12

cú pháp freaky ... – skaffman

+0

Toán tử giá trị mặc định không thể được sử dụng để đánh giá thành boolean. Như vậy, nó không thể được sử dụng trong câu lệnh if nếu được yêu cầu. – Madbreaks

84

Cái này có vẻ là một sự phù hợp tốt hơn:

<#if userName?has_content> 
... do something 
</#if> 

http://freemarker.sourceforge.net/docs/ref_builtins_expert.html

+2

Dường như kiểm tra xem var có tồn tại không và nếu nội dung của nó không rỗng hoặc rỗng (tham chiếu đến các chuỗi rỗng ở đây). –

+4

Có để downvote này bởi vì nó về mặt kỹ thuật không chính xác và sẽ dẫn đến hành vi ngoài ý muốn (sai âm) nếu biến * tồn tại * (những gì op muốn kiểm tra) nhưng là sản phẩm nào. – Madbreaks

2

tôi nghĩ rằng rất nhiều người đang muốn có thể kiểm tra xem liệu biến của họ không trống rỗng như w ell như thể nó tồn tại. Tôi nghĩ rằng việc kiểm tra sự tồn tại và sự trống rỗng là một ý tưởng hay trong nhiều trường hợp, và làm cho mẫu của bạn mạnh mẽ hơn và ít bị lỗi ngớ ngẩn hơn. Nói cách khác, nếu bạn kiểm tra để chắc chắn rằng biến của bạn không phải là rỗng và không rỗng trước khi sử dụng nó, thì mẫu của bạn trở nên linh hoạt hơn, bởi vì bạn có thể ném một biến null hoặc một chuỗi rỗng vào nó, và nó sẽ làm việc giống nhau Trong cả hai trường hợp.

<#if p?? && p?has_content>1</#if> 

Giả sử bạn muốn đảm bảo rằng p không chỉ là khoảng trắng. Sau đó, bạn có thể cắt nó trước khi kiểm tra xem nó has_content.

<#if p?? && p?trim?has_content>1</#if> 

CẬP NHẬT

Hãy bỏ qua đề nghị của tôi - has_content là tất cả những gì là cần thiết, vì nó thực hiện một kiểm tra null cùng với việc kiểm tra sản phẩm nào. Làm p?? && p?has_content tương đương với p?has_content, vì vậy bạn cũng có thể chỉ cần sử dụng has_content.

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