`
laowang
  • 浏览: 37497 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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中查看的构造函数却没有第一个参数,这是怎么回事儿?希望有明白的朋友指点一下)

分享到:
评论
6 楼 laowang 2009-10-15  
alanwu 写道
刚又看了一下lift1.1里object SiteMap定义了def apply(kids: Menu *) = new SiteMap(Nil, kids :_*)

yeah!太感谢了,就是他,又加深了一下apply的了解
5 楼 alanwu 2009-10-15  
刚又看了一下lift1.1里object SiteMap定义了def apply(kids: Menu *) = new SiteMap(Nil, kids :_*)
4 楼 laowang 2009-10-14  
alanwu 写道
lift版本不一样,你看的是1.0的版本,下的是1.1的源码。

汗死,不是没怀疑过这方面的原因,但是对mvn不太熟悉,还不知道怎么查看具体使用的版本。
3 楼 alanwu 2009-10-14  
lift版本不一样,你看的是1.0的版本,下的是1.1的源码。
2 楼 laowang 2009-10-14  
@alanwu
构造函数中有globalParamFuncs和kids两个参数,为什么api说明中只有kids一个?在代码中我也没找到另外的构造函数
1 楼 alanwu 2009-10-14  
引用
可是在api中查看的构造函数却没有第一个参数

什么意思?

相关推荐

Global site tag (gtag.js) - Google Analytics