Handlebars if method returns null / 空字符串
Handlebars if method returns null / empty string
我目前在 java (com.github.jknack.handlebars) 中使用车把
并有一个车把辅助方法来获得 link(背后有一些逻辑)
{{ getLink data.node}}
只渲染 url /subfolder/link.html
在我的车把模板中,我现在只想在辅助方法 returns 为非空字符串时打印 url(a-tag)(例如,有一个 link 可用)
我用
试过了
{{#if getLink data.node }}
<a href="{{ getLink data.node}}">Link-Text</a>
{{/if}}
但未呈现 link
我的 if 的正确语法是什么?
谢谢
RCX
编辑:
LinkHelper.class
中的 getLink 辅助方法
public CharSequence getLink(JsonObject node, Options options) throws IOException {
String link = fetchLink(node);
if(link != null){
return link;
}
return "";
}
通过
注册
HandlebarsTemplateEngineImpl.getHandlebars().registerHelpers(new LinkHelper());
Handlebars.java 没有很好的记录并且缺少几个单元测试(如果这个答案有帮助,请考虑贡献),出于某种原因调用嵌套 JsonObject
在 this 提交时删除,你仍然可以调用嵌套String
,但是有一个小括号的技巧。
完整示例:
import com.github.jknack.handlebars.Context;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.Helper;
import com.github.jknack.handlebars.Template;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Map;
public class HandlebarsJavaTest {
public static void main(String[] args) throws IOException {
Handlebars handlebars = new Handlebars();
Gson gson = new Gson();
handlebars.registerHelper("getLink", (Helper<Map<String, Object>>) (jsonObject, options) -> {
String link = fetchLink(jsonObject);
return link != null ? link : "";
});
String data = "{'data':{'node':'/bla.html', 'node2':'inside node2'}}";
// Pay attention to parentheses !!!
// {{#if (getLink data.node)}} throws ClassCastException, java.lang.String cannot be cast to java.util.Map
String rawTemplate = "{{#if (getLink data)}} <a href=\"{{getLink data}}\">Link-Text</a> {{/if}}";
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> map = gson.fromJson(data, type);
Template template = handlebars.compileInline(rawTemplate);
Context context = Context.newBuilder(map).build();
System.out.println(template.apply(context));
}
private static String fetchLink(Map<String, Object> map) {
try {
return map.get("node").toString();
} catch (NullPointerException npe) {
return null;
}
}
}
输出:
<a href="/bla.html">Link-Text</a>
如果节点只是一个字符串(相同的输出)
public static void main(String[] args) throws IOException {
Handlebars handlebars = new Handlebars();
Gson gson = new Gson();
handlebars.registerHelper("getLink", (Helper<String>) (node, options) -> node != null ? node : "");
String data = "{'data':{'node':'/bla.html', 'node2':'inside node2'}}";
// Pay attention to parentheses !!!
String rawTemplate = "{{#if (getLink data.node)}} <a href=\"{{getLink data.node}}\">Link-Text</a> {{/if}}";
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> map = gson.fromJson(data, type);
Template template = handlebars.compileInline(rawTemplate);
Context context = Context.newBuilder(map).build();
System.out.println(template.apply(context));
}
如果您坚持使用 this.[data]
或 this.[data.node]
节点是一个对象将无法完成工作,相同输出的工作示例:
import com.github.jknack.handlebars.Context;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.Helper;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
public class HandlebarsJavaTest {
public static void main(String[] args) throws Exception {
System.out.println(
new Handlebars()
.registerHelper("getLink", (Helper<JsonObject>) (json, options) -> {
try {
// logic here
return json.get("data").getAsJsonObject().get("node").getAsJsonObject().get("link").getAsString();
} catch (NullPointerException npe) {
return null;
}
})
// Pay attention to parentheses !!
.compileInline("{{#if (getLink this) }} <a href=\"{{getLink this}}\">Link-Text</a> {{/if}}")
.apply(
Context
.newBuilder(
new Gson()
.fromJson(
"{ 'data': { 'node': { 'link': '/bla.html' }, 'node2': 'inside node2' } }",
JsonObject.class
)
).build()
)
);
}
}
如果您有时间,请考虑通过添加适当的文档或至少单元测试来为此开源做出贡献 {{#if (method param)}}
。
根据 source code
package com.github.jknack.handlebars;
public class IfBlockTest extends AbstractTest {
@Test
public void falsy() throws IOException {
// empty string
shouldCompileTo("{{#if value}}true{{else}}false{{/if}}", $("value", ""), "false");
顺便说一句,#if
built-in helper 将 return False
用于空字符串,因此 if getLink
将执行 return "";
if条件不会并且不会呈现文本,要断言这一点,您可以在关闭前添加 {{else}}
if {{/if}}
并查看呈现的内容。
我目前在 java (com.github.jknack.handlebars) 中使用车把 并有一个车把辅助方法来获得 link(背后有一些逻辑)
{{ getLink data.node}}
只渲染 url /subfolder/link.html
在我的车把模板中,我现在只想在辅助方法 returns 为非空字符串时打印 url(a-tag)(例如,有一个 link 可用)
我用
试过了{{#if getLink data.node }}
<a href="{{ getLink data.node}}">Link-Text</a>
{{/if}}
但未呈现 link
我的 if 的正确语法是什么?
谢谢 RCX
编辑: LinkHelper.class
中的 getLink 辅助方法public CharSequence getLink(JsonObject node, Options options) throws IOException {
String link = fetchLink(node);
if(link != null){
return link;
}
return "";
}
通过
注册 HandlebarsTemplateEngineImpl.getHandlebars().registerHelpers(new LinkHelper());
Handlebars.java 没有很好的记录并且缺少几个单元测试(如果这个答案有帮助,请考虑贡献),出于某种原因调用嵌套 JsonObject
在 this 提交时删除,你仍然可以调用嵌套String
,但是有一个小括号的技巧。
完整示例:
import com.github.jknack.handlebars.Context;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.Helper;
import com.github.jknack.handlebars.Template;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Map;
public class HandlebarsJavaTest {
public static void main(String[] args) throws IOException {
Handlebars handlebars = new Handlebars();
Gson gson = new Gson();
handlebars.registerHelper("getLink", (Helper<Map<String, Object>>) (jsonObject, options) -> {
String link = fetchLink(jsonObject);
return link != null ? link : "";
});
String data = "{'data':{'node':'/bla.html', 'node2':'inside node2'}}";
// Pay attention to parentheses !!!
// {{#if (getLink data.node)}} throws ClassCastException, java.lang.String cannot be cast to java.util.Map
String rawTemplate = "{{#if (getLink data)}} <a href=\"{{getLink data}}\">Link-Text</a> {{/if}}";
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> map = gson.fromJson(data, type);
Template template = handlebars.compileInline(rawTemplate);
Context context = Context.newBuilder(map).build();
System.out.println(template.apply(context));
}
private static String fetchLink(Map<String, Object> map) {
try {
return map.get("node").toString();
} catch (NullPointerException npe) {
return null;
}
}
}
输出:
<a href="/bla.html">Link-Text</a>
如果节点只是一个字符串(相同的输出)
public static void main(String[] args) throws IOException {
Handlebars handlebars = new Handlebars();
Gson gson = new Gson();
handlebars.registerHelper("getLink", (Helper<String>) (node, options) -> node != null ? node : "");
String data = "{'data':{'node':'/bla.html', 'node2':'inside node2'}}";
// Pay attention to parentheses !!!
String rawTemplate = "{{#if (getLink data.node)}} <a href=\"{{getLink data.node}}\">Link-Text</a> {{/if}}";
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> map = gson.fromJson(data, type);
Template template = handlebars.compileInline(rawTemplate);
Context context = Context.newBuilder(map).build();
System.out.println(template.apply(context));
}
如果您坚持使用 this.[data]
或 this.[data.node]
节点是一个对象将无法完成工作,相同输出的工作示例:
import com.github.jknack.handlebars.Context;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.Helper;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
public class HandlebarsJavaTest {
public static void main(String[] args) throws Exception {
System.out.println(
new Handlebars()
.registerHelper("getLink", (Helper<JsonObject>) (json, options) -> {
try {
// logic here
return json.get("data").getAsJsonObject().get("node").getAsJsonObject().get("link").getAsString();
} catch (NullPointerException npe) {
return null;
}
})
// Pay attention to parentheses !!
.compileInline("{{#if (getLink this) }} <a href=\"{{getLink this}}\">Link-Text</a> {{/if}}")
.apply(
Context
.newBuilder(
new Gson()
.fromJson(
"{ 'data': { 'node': { 'link': '/bla.html' }, 'node2': 'inside node2' } }",
JsonObject.class
)
).build()
)
);
}
}
如果您有时间,请考虑通过添加适当的文档或至少单元测试来为此开源做出贡献 {{#if (method param)}}
。
根据 source code
package com.github.jknack.handlebars;
public class IfBlockTest extends AbstractTest {
@Test
public void falsy() throws IOException {
// empty string
shouldCompileTo("{{#if value}}true{{else}}false{{/if}}", $("value", ""), "false");
顺便说一句,#if
built-in helper 将 return False
用于空字符串,因此 if getLink
将执行 return "";
if条件不会并且不会呈现文本,要断言这一点,您可以在关闭前添加 {{else}}
if {{/if}}
并查看呈现的内容。