簡體   English   中英

如何使用jsinterop定義數組屬性?

[英]How to define array property using jsinterop?

我正在嘗試使用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訪問task屬性,就像將其定義為@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;
            }
        };
    }
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM