GWT JsInterop:JsType属性,带" - "在名字中

时间:2016-04-26 14:12:56

标签: gwt

我想包装Javascript对象

{"Ctrl-Space": "autocomplete"}

到GWT。 当我尝试:

@JsType
public class ExtraKeyType {
    @JsProperty(name = "Ctrl-Space")
    public String ctrlSpace = "autocomplete";
}

我收到错误

  

String ExtraKeyType.ctrlSpace'名称无效' Ctrl-Space

是否可以使用JsInterop包装它?

2 个答案:

答案 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类型,看起来像一个有趣的(几乎需要的)功能。

这是您的下一步:https://github.com/gwtproject/gwt/issues/new

答案 1 :(得分:0)

您不能使用简单的@JsProperty注释来做到这一点。

一种解决方法是使用jsinterop-base库,类JsJsPropertyMap,如下所示:

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();
    }

}