如何使用jsinterop定义数组属性?

时间:2015-01-09 11:04:27

标签: javascript gwt smartgwt gwt2 gxt

我正在尝试使用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正式问世时会有更合适的解决方案。

1 个答案:

答案 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);