songboriceboy
发表于: 2013/1/13 21:33 引用 回复 只看该作者 1# TOP
版主
性别: 男
积分:461
阅读权限:659
帖子: 108
加入时间: 2011/8/31
最后登录: 2015/11/10

书接上回

本节来分析wojilu.Web.Controller.Layouts SiteLayoutController的Layout方法

public override void Layout() {

load("topNav", new TopNavController().Index);

对照framework\views\Layouts\SiteLayout\Layout.html里的前端视图代码看一下

以下代码片段

<body>

#{topNav}
<div id="pageWrap">
<div id="pageWrapInner">

#{header}

<div id="pageMainWrap">

load("topNav", new TopNavController().Index);

是对上面的topNav变量赋值,赋什么值呢,看一下load的定义

protected void load( String sectionName, aAction action ) {
set( sectionName, loadHtml( action ) );
}

 可以看出是将framework\views\Layouts\TopNav\Index.html的内容填充后,替换#{topNav}

同理 load("header", new TopNavController().Header);

是将framework\views\Layouts\TopNav\Header.html的内容填充后,替换#{header}

接下来我们看一下TopNavController().Index和framework\views\Layouts\TopNav\Index.html有没有什么可以挖掘的东西。

我们看到TopNavController().Index最后有一句    set( "navUrl", t2( Nav ) );

对framework\views\Layouts\TopNav\Index.html最后的变量#{navUrl}进行了赋值,参见以下:

<script type="text/javascript">var ctx = null;var navUrl = '#{navUrl}';</script>
<script type="text/javascript" src="~js/wojilu.site.topnav.js?v=#{jsVersion}"></script>

欲知此处的奥秘,我们就要看下wojilu.web\static\js\wojilu.site.topnav.js的实现了

$(document).ready( function() {

navUrl = (navUrl + '?url='+window.location.href).toAjax();

......

$.post( navUrl, function(data) {

ctx = data;

......

}

这里通过ajax的post方法,再次请求了服务器TopNavController()的Nav action

public void Nav() {

// TODO 如果是在访问用户空间,则判断:是否好友、是否关注
echoJson( getLoginJsonString() );
}

Nav()方法返回一段json给客户端。动态设置用户的一些状态和权限。

 load("header", new TopNavController().Header);

主要是加载site的菜单和子菜单。有空再进行深入探讨。

综上所述,整个流程,有两次服务器访问,一次是页面加载,一次是js请求topnav的json数据。

关键词 我记录学习研究 修改tag
相关文章
三人行必有我师
掷鸡蛋者
发表于: 2013/1/14 9:00 引用 回复 只看该作者 2# TOP
管理员
性别: 男
积分:52175
阅读权限:43387
帖子: 8319
加入时间: 2010/4/29
最后登录: 2019/11/9

今日再顶

而死,不默而生

快速回复主题