Как определить свойство массива с помощью jsinterop?
Я пытаюсь определить тип javascript, используя JsInterop, но не могу понять, как правильно определить массив внутри типа.
@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, и так как тип определения является типом 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' }
];
}*-/;
}
Таким образом, к свойству tasks можно получить доступ из javascript, как если бы оно было определено как @JsProperty. Это только временное решение, и я уверен, что оно будет более подходящим, когда JsInterop официально выйдет.
1 ответ
Это должно работать как описано. Вот пример:
@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);