2012-08-08 39 views
9

Xin chào freemarkers guruchức năng Freemarker vs macro

Tôi hiểu rằng sự khác biệt giữa các chức năng Freemarker và macro là macro có thể in đến đầu ra, nhưng không thể trở về giá trị, trong khi chức năng có thể trả về giá trị nhưng không thể in đến đầu ra.

Vâng, tôi đang gặp một vấn đề bởi vì tôi cần cả hai để in và trở về giá trị:

Tôi đang làm thăm dò cây đệ quy với Freemarker và do đó tôi có một macro được gọi recurvively. Khi cây đang được khám phá, tôi cần cả hai để in thông tin nút đến đầu ra, nhưng cũng tính toán và trả về số liệu thống kê về các nút được khám phá (ví dụ tổng của một thuộc tính cụ thể của các nút được khám phá)

Nếu tôi sử dụng macro được gọi là recurvively tôi có thể in thông tin nút nhưng không thể trả về số liệu thống kê cho thực thể gọi.

Nếu tôi sử dụng một hàm đệ quy được gọi, tôi có thể trả về số liệu thống kê nhưng không thể in thông tin nút trên đầu ra.

Một giải pháp có thể là khám phá cây hai lần, một lần để in thông tin nút và một thông tin khác để thu thập số liệu thống kê, nhưng tôi ghét sử dụng giải pháp không quan trọng này.

Ai đó có thể đề xuất giải pháp tốt hơn không?

Cảm ơn

Trả lời

0

Bạn có thể lưu trữ số liệu trong biến số không #local. Giống như ở các vùng marco bạn làm <#assign treeStats = ...> và sau đó theo yêu cầu tại chỗ:

<#import my="myutils.ftl"> 
... 
<@my.tree input /> 
<#assign stats = my.treeStats /> <#-- or whatever you want with my.treeStats --> 

Yeah, đó là vụng về, nhưng Freemarker không có out-params để trả về một kết quả thứ yếu. Trên thực tế, bạn có thể làm một hack với loop-biến, nhưng nó có lẽ quá khó hiểu, cộng thêm nếu bạn thực sự cần một cơ thể, bạn không thể sử dụng thủ thuật này:

<@my.tree input; res><#assign stats = res></@> 
1

Hoặc thậm chí bạn có thể sử dụng một biến toàn cầu như bộ nhớ cho số liệu thống kê của bạn:

<#global stats = [] /> 

<#-- then when you call your function --> 
<#assign = method() /> 

<#function method param = ""> 
    <#-- do something and before you return you push the stats to the global variable, if you choose my approach of "merging" sequences, be careful that you wrap the new stats item also in a sequence or it will fail miserably =) --> 
    <#global stats = stats + [{"statvar1": 10, "statvar2": 30}] /> 

    <#return whateveryoulike /> 
</#function> 
Các vấn đề liên quan