engine 自定义 directive 的变量作用域可以限制到指令内吗

我现在定义了一个指令,在指令内定义了一个变量product,我的本意这个变量的作用域就是在指令内有效,指令外应该访问不到才是。

public void exec(Env env, Scope scope, Writer writer) {
	Object categoryId = idExpr.eval(scope);
		
	List<Product> list = srv.getProductList(categoryId);
		
	for(Product product : list) {
		scope.setLocal("product", product);
		stat.exec(env, scope, writer);
	}
}


但是我在当前Controller请求内也设置了一变量product,执行渲染结果是这个product的值变成上面那个指令变量product最后一个赋值了

public void index() {
	Product product = srv.getProduct(get(0));
	if(null == product) {
		render("product.html");
		return;
	}
		
	set("product", product);
		
	Template template = srv.getTemplate(product.getTemplateId());
	if(null == template) {
		render("product.html");
	} else {
		render(template.getTemplateFilename());
	}
}

现在能做的只能是避免变量名重复,但是如果定义的指令很多的话,这样变量定义就是个头痛问题。

但是又想想,如果当前Controller请求内的变量进到指令的html代码里调用,这样也会出现不知道是哪个的问题,很矛盾啊。



评论区

tbynet

2019-10-28 09:08

找到了,可以在指令内开一个新作用域:scope = new Scope(scope);

JFinal

2019-10-28 10:28

@tbynet 悟性不错,赞

热门反馈

扫码入社