java - Lodash 模板引擎 Nashorn

标签 java lodash nashorn

我目前正在尝试通过 nashorn 在 Java 中使用 lodash 模板引擎,但遇到了问题。

代码如下:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine nashorn = mgr.getEngineByName("nashorn");
ScriptContext ctx = nashorn.getContext();
Bindings bindings = ctx.getBindings(ScriptContext.ENGINE_SCOPE);
nashorn.eval(readFileToString("externallibs/lodash.min.js"), bindings);
String tpl = readFileToString("hello.tpl");
bindings.put("tpl", tpl);
nashorn.eval("compiled = _.template(tpl);", bindings);
ScriptObjectMirror compiled = (ScriptObjectMirror)nashorn.get("compiled");
System.out.println("compiled = " + compiled);
Map<String, String> props = new HashMap<String, String(1);
props.put("name", "world");
bindings.put("props", props);
System.out.println(compiled.call(this, bindings.get("props"));

该模板由 Nashorn 精心编译,如果您查看控制台,您会看到:

compiled = function(obj){obj||(obj={});var __t,__p='';with(obj){__p+='Hello, '+((__t=( name ))==null?'':__t);}return __p}

但是当我尝试使用 map 作为参数( Prop )来调用上面编译的模板函数时,就像在 JS 中所做的那样: tpl.call(这个, {name:'world'})

它失败并出现以下错误:

类型错误:无法将“with”应用于非脚本对象

事实上,我们可以看到该函数的编译版本使用了“with”关键字。

有人知道如何解决这个问题吗?我应该如何发送参数来渲染编译后的模板?

非常感谢您的帮助。

最佳答案

您需要将 JS 脚本对象传递给“with”语句。任意 Java 对象(不是 JS 对象 - 例如 java.util.Vector 或类 Foo 的对象)不能用作“with”表达式。您可以使用类似的代码创建一个空脚本

Object emptyScriptObj = engine.eval("({})");

并将emptyScriptObj传递给您的ScriptObjectMirror.call方法调用,例如。

关于java - Lodash 模板引擎 Nashorn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30887429/

相关文章:

java - 在字符串中显示带有图像位置的图像

javascript - 从对象中删除属性而不创建新属性(无删除操作)

node.js - lodash uniqBy 不是 id 字段上的 uniqing

java - 如何使用 webpack js 文件从 Nashorn 调用方法?

java - 运行 Nashorn JavaScript 的 Gradle 任务

java - 使用 OR 运算符进行 boolean 赋值

java - C++ 和 Java 中 CRC32 的不同结果

java - 重写 Application 类并通过静态变量访问它是否安全?

javascript - 我可以传递对特定对象的实例函数的引用吗?

java - 是否可以让 Nashorn 从类路径加载脚本?