自定义前端指令判断是否定义了模板函数

    JFinal的Enjoy模板可以很好的实现前端页面中的各功能模块的分离,如header,menu,left,bottom,navigation,contain等都可以分离到一个个单独的页面中,再通过Enjoy的模板函数来实现自动整合。

    除了可以对相对单独的页面进行分离,对某些动态内容也可以通过Enjoy的模板函数来实现分离与整合,让我们的前端页面各功能各按其责,而不是混在一起,难以维护。

    模板页面中调用模板函数也支持安全调用,如 #@name?(p1, p2…, pn),即使这个name函数不存在也不会出错。但有时需要明确的判断在页面中是否定义了这个模板函数,如下面的场景:                     

     <div class="page-header">#@header?()</div>

    如果在页面中没定义header()函数,上述写法也不会报错,但执行完的html中就会变成 <div class="page-header"></div>,自动多了个<div></div>出来,如果想当header()函数不存在时不显示这个<div></div>,则需要在页面中明确判断是否存在这个header()函数,由于现在jfinal还没有实现这个方法,在波总的开发群中得到支持,此处需要用到自定义前端指令,用于判断是否在页面中定义了这个函数。

开发步骤:

1:编写自定义前端指令class类:

package com.cz.utils;

import com.jfinal.template.Directive;
import com.jfinal.template.Env;
import com.jfinal.template.io.Writer;
import com.jfinal.template.stat.Scope;

public class IfDefFuncDirective extends Directive {

   public void exec(Env env, Scope scope, Writer writer) {
      Object funcName = exprList.eval(scope);
      if (funcName != null && 
           env.getFunction(funcName.toString()) != null) {
         stat.exec(env, scope, writer);
      }
   }
	
   public boolean hasEnd() {
      return true;
   }
}


2:AppConfig.java启动类中配置该自定义指令:

public void configEngine(Engine me) {
   me.setDevMode(p.getBoolean("engineDevMode", false));
   me.addDirective("ifDefFunc", IfDefFuncDirective.class);
   ......
}


3:前端引用:

 #ifDefFunc('header')
    <div class="page-header">#@header?()</div>
 #end


ps:JFinal 俱乐部真挺不错,会员非常活跃,有问必答,物超所值。

评论区

JFinal

2018-09-02 12:01

#ifDefFunc 这个需求第一次被提出,确实比较实用,感谢博主的分享

fansunion

2018-09-13 17:45

物超所值

热门分享

扫码入社