我想包装Javascript对象
{"Ctrl-Space": "autocomplete"}
到GWT。 当我尝试:
@JsType
public class ExtraKeyType {
@JsProperty(name = "Ctrl-Space")
public String ctrlSpace = "autocomplete";
}
我收到错误
String ExtraKeyType.ctrlSpace'名称无效' Ctrl-Space
是否可以使用JsInterop包装它?
答案 0 :(得分:0)
这是不可能的,但它是故意的。它受到强制有效JS标识符的正则表达式https://github.com/gwtproject/gwt/blob/master/dev/core/src/com/google/gwt/dev/js/JsUtils.java#L496的限制。
您应该注意这是非法的{with-dash:“bad”},因为破折号对于标识符https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types无效。但这是合法的{with_underscore:“right”},它在JsInterop中正常工作。但是,JS很棘手,它实际上支持无效标识符,只需要引用,所以你可以写{“with-dash”:“也是”}。
所以看起来你要求的是改进JsInterop以支持本机类型属性中的无效标识符。我认为这还不支持,因为例如无效的标识符不能与点表示法一起使用,因此生成的JS代码对于无效标识符将是不同的。但是,如果要将JSON映射到Java类型,看起来像一个有趣的(几乎需要的)功能。
答案 1 :(得分:0)
您不能使用简单的@JsProperty
注释来做到这一点。
一种解决方法是使用jsinterop-base
库,类Js
和JsPropertyMap
,如下所示:
import jsinterop.annotations.JsOverlay;
import jsinterop.base.Js;
@JsType
public class ExtraKeyType {
//@JsProperty(name = "Ctrl-Space")
//public String ctrlSpace = "autocomplete";
@JsOverlay
public final void setCtrlSpace(String value) {
Js.asPropertyMap(this).set("Ctrl-Space", value);
}
@JsOverlay
public final String getCtrlSpace() {
return Js.asPropertyMap(this).getAny("Ctrl-Space").asString();
}
}