【问题标题】:Calling Macro function in Velocity template在 Velocity 模板中调用宏函数
【发布时间】:2011-10-18 08:43:19
【问题描述】:

我试图弄清楚如何从速度宏调用中返回一个值并将其分配给一个变量

我的宏函数看起来像这样。它曾经是共同的共享宏文件

#macro(getBookListLink, $readingTrackerResult)
   $readingTrackerResult.getBookListLink()
#end

我需要将此宏的结果分配给另一个速度模板文件中的变量

我试过这样的

#set($book_list_link = #getBookListLink( $readingTrackerResult ))

但是没有用。我尝试使用 #,$ 并且在函数 getBookListLink 前面没有任何内容。但没有任何效果。我不能从宏返回吗?我的宏有问题吗?

但是,如果我在 html 文件中单独调用 #getBookListLink( $readingTrackerResult )。它可以工作,我可以将结果打印到 UI。但无法分配给变量。

【问题讨论】:

  • 我在调用时遇到了多余空格的问题。可悲的是,即使在行尾使用 cmets (##) 的技巧,也没有用。

标签: java apache velocity


【解决方案1】:

宏不是函数;它们用于渲染输出。但是,如果您不介意丢失类型并以文本形式获取结果...

#set( $book_list_link = "#getBookListLink( $readingTrackerResult )" )

【讨论】:

  • 如果函数需要一个字符串参数,那么我们需要使用如下:#set( $book_list_link = "#getBookListLink('string_argument')" )
【解决方案2】:

要去除空格和空行,请使用多行 cmets (#* comment *#):

#macro( myMacro $param )#*
  *#the_return_value#*
*##end

【讨论】:

    【解决方案3】:

    不要忍受“返回值”的字符串限制,最好可以“通过引用”传递外部定义的结果变量,例如:

    #macro(getBookListLink $inTrackerResult $outBookListLink)
        #if ($outBookListLink)
            #set ($outBookListLink = $inTrackerResult.getBookListLink())
        #end
    #end
    
    #set ($myLink = "")
    #getBookListLink($myTrackerResult $myLink)
    myBookListLink = "$myLink"<br/>
    

    【讨论】:

      【解决方案4】:

      再举例说明原理:

      宏定义:

      #macro ( getValue $flag )
      #if ( $flag )
      #set($value = "TRUE" )
      #else
      #set($value = "FALSE" )
      #end
      ${value}## (ends with a comment to avoid "END-OF-LINE" in the resulting string)
      #end
      

      致电:

      #set($myval = "#getValue( true )" )
      

      【讨论】:

        【解决方案5】:

        宏参数可以是对象列表。被调用的宏可以从列表中提取每个对象,对其进行操作,然后调用者将看到更改。

        #macro(call $something)
          #set($swallowOutput = $something)
        #end
        
        #macro(doSomething $out)
          #set($list=$out.get(0))
          #call($list.add("hallo-1")
          #call($list.add("hallo-2")
        #end
        
        #macro(doMoreComplexStuff)
          #set($myList=[])
          #doSomething([$myList])
          MyList now has $myList.size()) elements: $myList
        #end
        

        【讨论】:

          【解决方案6】:

          或者只是将所有内容写到同一行:

          #macro( myMacro $param ) the_return_value #end
          

          【讨论】:

            猜你喜欢
            • 2017-03-31
            • 1970-01-01
            • 2016-03-26
            • 2014-03-18
            • 1970-01-01
            • 1970-01-01
            • 2022-09-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多