Как определить свойство массива с помощью 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);
Другие вопросы по тегам