hellolift学习笔记(2)

3.菜单
在页面上可以看到,除了index.html中输出的内容之外,页面上还有一个操作菜单,这个菜单是如何形成的呢?
在default.html中有
<lift:Menu.builder/>

这又是一个snippet的运用,不过是lift内置的snippet,这个class在lift-webkit包中的可以找到,源代码位于lift\src\main\scala\net\liftweb\builtin\snippet\Menu.class,很多lift内置的snippet都在这里可以找到,不过我看到了surround,没有看到bind
Menu的builder方法从LiftRules.siteMap中得到menu的内容,siteMap的定义在Boot.scala中进行,如下

// Build SiteMap
val entries = Menu(Loc("Home", List("index"), "Home")) ::
Menu(Loc("Request Details", List("request"), "Request Details")) ::
User.sitemap ::: Entry.sitemap
LiftRules.setSiteMap(SiteMap(entries:_*))



Loc("Home", List("index"), "Home")

定义了一个Loc,三个参数分别是名称,链接和菜单显示的文本,其中第二个参数是相对于web context的URI用'/'分割后得到的数组
Menu的构造如下

case class Menu(val loc : Loc[Any], val kids : Menu*)
extends HasKids with Product

这里User.sitemap和Entry.sitemap是两个List[Menu],分别定义了各自相关的菜单项。Entry.sitemap在hellolift\src\main\scala\com\hellolift\model\Entry.scala中定义,Uesr.sitemap则在其继承的MetaMegaProtoUser中定义(位于lift-mapper\src\main\scala\net\liftweb\mapper\ProtoUser.scala)其中的内容以后再仔细学习。
两个Menu,两个List[Menu]构成了entries这样一个新的List[Menu]
再来看最后一句
SiteMap的实现中的定义是

def apply(kids: Menu *)

定义中的*是Repeated parameters语法,表示最后一个参数是可以重复的(参考《The Definitive Guide To Lift》ch8.8)
entries:_* 表示把变量entries的每一个元素作为参数传递给函数,而不是把变量作为一个参数传递
这里SiteMap(entries:_*),是对object SiteMap.apply()方法的调用,构造了一个SiteMap对象,在调用
LiftRules.setSiteMap方法之后,我们就完成了一个系统菜单的创建,菜单包括这里定义的Home,Request Details和分别有User,Entry的model创建的各自的菜单。

(这里有个疑问,从源代码中看,SiteMap的定义是这样的

case class SiteMap(globalParamFuncs: List[PartialFunction[Box[Req], Loc.LocParam]], kids: Menu*) extends HasKids 

可是在api中查看的构造函数却没有第一个参数,这是怎么回事儿?希望有明白的朋友指点一下)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值