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中查看的构造函数却没有第一个参数,这是怎么回事儿?希望有明白的朋友指点一下)
分享到:
相关推荐
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip...
希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf希沃白板学习笔记.pdf
Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...
人工智能学习笔记,人工智能学习笔记,人工智能学习笔记人工智能学习笔记,人工智能学习笔记,人工智能学习笔记人工智能学习笔记,人工智能学习笔记,人工智能学习笔记人工智能学习笔记,人工智能学习笔记,人工智能...
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
CCNA学习笔记 CCNA学习笔记 CCNA学习笔记
nginx学习笔记(软件+学习笔记) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! nginx学习笔记(软件+学习笔记) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! nginx学习笔记(软件+学习笔记) ...
docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,...
PHP个人学习笔记
Contiki学习笔记:进程、事件、etimer关系 Contiki 实例: Contiki学习笔记:创建两个交互进程 Contiki 主函数剖析: Contiki学习笔记:main函数剖析 Contiki学习笔记:启动一个进程process_start Contiki学习笔记...
ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1 ssh学习笔记1
java学习笔记java学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记...