我正在尝试使用JsInterop定义javascript类型,但无法弄清楚如何在类型中定义数组属性。
@JsType
public interface Task
{
// this works
@JsProperty String getTitle();
@JsProperty void setTitle(String title);
}
@JsType
public interface ViewModelInterface
{
// the following works
@JsProperty String getValue();
@JsProperty void setValue(String val);
// this does not work
@JsProperty Task[] getTasks();
@JsProperty void setTasks(Task[] tasks);
}
我应该使用哪种特殊语法?
更新:
我想出了一个问题的临时解决方案。我尝试将JNSI与JsInterop一起使用,因为类型define是javascript类型,我们可以在初始化后添加该类型的任何属性。
代码在这里
public class ViewModel implements ViewModelInterface
{
private String value;
public ViewModel()
{
value = "";
initTasksArray();
}
public String getValue() { return value; }
public void setValue(String val) { this.value = val; }
private native void initTasksArray()
/*-{
this.tasks =
[
{ title: 'Get high enough to grab the flag' },
{ title: 'Find the Princess' }
];
}*-/;
}
这样,可以从javascript访问tasks属性,就好像它被定义为@JsProperty一样。这只是一个临时解决方案,我相信当JsInterop正式问世时会有更合适的解决方案。
答案 0 :(得分:0)
它应该如所描述的那样工作。 这是一个例子:
@JsType
public interface Task {
@JsProperty
String getTitle();
@JsProperty
void setTitle(String title);
public static Task getTask(String title) {
return new Task() {
private String title;
@Override
public String getTitle() {
return title;
}
@Override
public void setTitle(String title) {
this.title = title;
}
};
}
}
和
@JsType
public interface ViewModel {
@JsProperty
Task[] getTasks();
@JsProperty
void setTasks(Task[] tasks);
public static ViewModel getModel() {
return new ViewModel() {
Task[] tasks;
@Override
public void setTasks(Task[] tasks) {
this.tasks = tasks;
}
@Override
public Task[] getTasks() {
return tasks;
}
};
}
}
和Javascript:
var model = ViewModel.getModel();
model.tasks = [Task.getTask('title1'), Task.getTask('title2')];
alert(model.tasks);