Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jsinterop定义数组属性?_Javascript_Gwt_Smartgwt_Gwt2_Gxt - Fatal编程技术网

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

Javascript 如何使用jsinterop定义数组属性?,javascript,gwt,smartgwt,gwt2,gxt,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 wor

我试图使用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一起使用,因为类型定义是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正式推出时,会有一个更合适的解决方案

它应该按照所描述的那样工作。 以下是一个例子:

@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;
            }
        };
    }
}

还有Javascript:

var model = ViewModel.getModel();
model.tasks = [Task.getTask('title1'), Task.getTask('title2')];
alert(model.tasks);
var model = ViewModel.getModel();
model.tasks = [Task.getTask('title1'), Task.getTask('title2')];
alert(model.tasks);