模板渲染就是GET请求的处理过程.这之前要先理解其中的view.showRoot方法,也就是/server/utils/view.js文件,三个方法show/showOne/showRoot。

show

/**
 * @param path  主路径,默认会在此参数前带上/templates就是实际模板文件路径
 * @param params  页面参数,默认带上页面title参数
 * @param pathList  页面组件路径列表,
 * 可以是数组,默认第1个作为herder.html,第2个为footer.html,并将path插入中间
 * @returns 返回合并后的html页面代码
 */
function show(path,params,pathList) {
  return function *(){
    var output =[],
      ctx = this;

    params = params || {};
    pathList = setPathList(path,pathList);
    params = setParams(params,ctx);

    // 页面拼接
    for (var i = 0; i < pathList.length; i++) {
      var page = yield render(pathList[i],params);
      output.push(page);
    }

  }
}

show方法主要用于高鸣项目下,比如一次调用:

this.body = yield view.show('/home/index', {banners:[]});

show方法的三个参数分别是将要渲染的页面地址,参数与页面片段(数组)。

pathList = setPathList(path,pathList);

上述代码得到将要渲染的页面的一个数组,如果pathlist存在,则把path的路径插入pathlist中并返回来,否则则使用的默认的:

pathList = ['/public/header',path,'/public/footer'];

然后遍历这个数组,使用render渲染路径页面得到返回的页面数据,然后放到output中拼接返回。

setPathList

function setPathList(path,pathList) {
  if(pathList && Array.isArray(pathList)) {             /*自定义页面合成*/
    pathList.splice(1, 0, path);
  }else if(path.indexOf('/webview/') > -1){             /*webview页面合成*/
    pathList = ['/webview/public/header',path,'/webview/public/footer'];
  }else{
    pathList = ['/public/header',path,'/public/footer']; /*默认页面合成*/
  }

  return pathList;
}

如果pathlist存在并是一个数组,则把path插入第一个位置。

如果路径包括webview,则使用webview的header与footer,否则使用public下的。

setParams

这个方法主要目的是进行参数的处理,假如我们执行

setParams({ startRouter: '/account/login'})

则返回的是:

{ 
  startRouter: '/account/login',
  manifest: 0,
  appFrom: 'wutong',
  publicKey: '',
  title: '梧桐理财',
  ctrlName: 'accountLogin',
  moduleName: 'login',
  isCompile: false,
  host: '192.168.1.213:2020',
  route: '/account/login',
  path: '/account/login' 
}

showOne

// == 单页面输出,不带任何头部、尾部等组件
function showOne(path,params) {
  return function* (){
    var ctx = this;
    params = params || {};
    params = setParams(params,ctx);

    return yield render(path,params);
  }
}

只输出不带头部的模板

showRoot

其实showRoot与showOne代码基本上完全一致。除了showRoot会自动在路径加上/templates。


此时,我们再看get请求的代码。

    var startRouter = this.path || config.app.startRouter,
          indexName = config.app.index || 'index',
          subIndexName = 'index',
          isSubapp = config.subapp && pathName in config.subapp;//是否为子应用

        this.body = isSubapp
          ? yield view.showRoot('/subapp/' + pathName + '/' + subIndexName, {startRouter: startRouter})
          : yield view.showRoot('/' + indexName, {startRouter: startRouter});

        return;

此处会判断是否子应用,来命中不同文件的文件。

我们以命名wap应用为例

this.body = yield view.showRoot('/index', {})

也就是说所有的页面都是渲染index.html,然后通过参数传到前端应该访问的模块,通过前端路由来调到对应的页面。

results matching ""

    No results matching ""