2015-01-09 2 views
2

JsInterop을 사용하여 자바 스크립트 유형을 정의하려고하지만 유형 내부에 배열 속성을 정의하는 방법을 파악할 수 없습니다.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); 
} 

사용해야하는 특수 구문이 있습니까?

업데이트 :

나는 임시 해결책을 생각해 냈습니다. 나는 JsInterop과 함께 JNSI를 사용하려고했는데, 타입 정의가 javascript 타입이기 때문에 초기화 된 후에 그 타입의 어떤 프로퍼티도 추가 할 수있다.

는 코드는이 @JsProperty로 정의되는 것처럼 작업 속성이 자바 스크립트에서 액세스 할 수 있습니다, 여기

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' } 
     ]; 
    }*-/; 
} 

이 방법입니다. 이것은 일시적인 해결책 일 뿐이며 JsInterop이 정식으로 나올 때 더 적절한 것이 될 것이라고 확신합니다.

답변

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

및 자바 :

var model = ViewModel.getModel(); 
model.tasks = [Task.getTask('title1'), Task.getTask('title2')]; 
alert(model.tasks); 
다음은 예이다
관련 문제