2012-04-13 28 views
5

Có cách nào để nhận proxy mà trình chỉnh sửa đang chỉnh sửa không?GWT Editor framework

Các quy trình làm việc bình thường sẽ là:

public class Class implments Editor<Proxy>{ 
    @Path("") 
    @UiField AntoherClass subeditor; 


    void someMethod(){ 
    Proxy proxy = request.create(Proxy.class); 
    driver.save(proxy); 
    driver.edit(proxy,request); 
} 
} 

Bây giờ nếu tôi có một thơ ký tòa soạn của proxy cùng

public class AntoherClass implements Editor<Proxy>{ 
    someMethod(){ 
    // method to get the editing proxy ? 
    } 
} 

Có tôi biết tôi chỉ có thể thiết lập proxy để các biên tập viên trẻ với setProxy () sau khi tạo ra nó, nhưng tôi muốn biết nếu có cái gì đó giống như HasRequestContext nhưng đối với proxy đã chỉnh sửa.

Điều này hữu ích khi bạn sử dụng ví dụ ListEditor trong đối tượng không phải giao diện người dùng.

Cảm ơn bạn.

Trả lời

7

Hai cách để bạn có thể tham chiếu đến đối tượng mà một trình chỉnh sửa cụ thể đang làm việc. Thứ nhất, một số dữ liệu đơn giản và một trình soạn thảo đơn giản:

public class MyModel { 
    //sub properties... 

} 

public class MyModelEditor implements Editor<MyModel> { 
    // subproperty editors... 

} 

đầu tiên: Thay vì thực hiện Editor, chúng ta có thể chọn một giao diện mà cũng mở rộng Editor, nhưng cho phép phụ biên tập viên (LeafValueEditor không cho phép phụ biên tập). Cho phép thử ValueAwareEditor:

public class MyModelEditor2 implements ValueAwareEditor<MyModel> { 
    // subproperty editors... 

    // ValueAwareEditor methods: 
    public void setValue(MyModel value) { 
    // This will be called automatically with the current value when 
    // driver.edit is called. 
    } 
    public void flush() { 
    // If you were going to make any changes, do them here, this is called 
    // when the driver flushes. 
    } 
    public void onPropertyChange(String... paths) { 
    // Probably not needed in your case, but allows for some notification 
    // when subproperties are changed - mostly used by RequestFactory so far. 
    } 
    public void setDelegate(EditorDelegate<MyModel> delegate) { 
    // grants access to the delegate, so the property change events can 
    // be requested, among other things. Probably not needed either. 
    } 
} 

này yêu cầu bạn thực hiện các phương pháp khác nhau như trong ví dụ trên, nhưng một trong những chính bạn quan tâm sẽ được setValue. Bạn không cần phải gọi những chính mình, họ sẽ được gọi bởi người lái xe và các đại biểu của nó. Phương pháp flush cũng tốt để sử dụng nếu bạn có kế hoạch thay đổi đối tượng - thực hiện những thay đổi đó trước khi tuôn ra có nghĩa là bạn đang sửa đổi đối tượng ngoài vòng đời của trình điều khiển mong đợi - chứ không phải kết thúc của thế giới. .

Thứ hai: Sử dụng một SimpleEditor tiểu biên tập:

public class MyModelEditor2 implements ValueAwareEditor<MyModel> { 
    // subproperty editors... 

    // one extra sub-property: 
    @Path("")//bound to the MyModel itself 
    SimpleEditor self = SimpleEditor.of(); 

    //... 
} 

Sử dụng này, bạn có thể gọi self.getValue() để đọc ra những gì giá trị hiện tại là.

Edit: Nhìn vào AnotherEditor bạn đã thực hiện, có vẻ như bạn đang bắt đầu để làm một cái gì đó giống như lớp GWT SimpleEditor, mặc dù bạn có thể muốn sub-biên tập viên khác cũng như:

Bây giờ nếu tôi có một thơ ký tòa soạn của proxy cùng

public class AntoherClass implements Editor<Proxy>{ 
    someMethod(){ 
    // method to get the editing proxy ? 
    } 
} 

thơ ký tòa soạn này có thể thực hiện ValueAwareEditor<Proxy> thay vì Editor<Proxy>, và được đảm bảo rằng setValue m của nó ethod sẽ được gọi với cá thể Proxy khi chỉnh sửa bắt đầu.

+0

Có nó hoạt động, tôi chỉ cần thực hiện ValueAwareEditor và setValue đặt proxy tự động. Từ API "Người chỉnh sửa có thay đổi hành vi dựa trên giá trị đang được chỉnh sửa sẽ triển khai giao diện này". Đó là trường hợp của tôi. =) –

+0

Cảm ơn Colin vì sự giúp đỡ này (đặc biệt là cho @Path (""): Tôi đã bị cám dỗ để làm một @Path ("này") nhưng điều đó sẽ yêu cầu điều trị đặc biệt ...) Bây giờ tôi muốn biết cách chuyển từ trình chỉnh sửa sang trình chỉnh sửa khác tùy thuộc vào giá trị dữ liệu. Tôi có một hộp chọn mà nên thay đổi hình thức (nhiều lĩnh vực phổ biến nhưng bố trí và một số lĩnh vực appaer/biến mất). Tôi có một UiBinder cho mỗi loại, và tôi muốn chuyển đổi từ một đến khác trên lựa chọn người dùng. Tôi không thích ý tưởng tạo ra tất cả và làm cho chúng có thể nhìn thấy hay không tùy thuộc vào tình hình. Tôi muốn tạo một trình soạn thảo mới và gán nó –

0

This is the only solution I found. Nó liên quan đến việc gọi bối cảnh chỉnh sửa trước khi bạn gọi trình chỉnh sửa trình điều khiển. Sau đó, bạn có proxy để thao tác sau này.

2

Trong lớp trình chỉnh sửa con của bạn, bạn chỉ có thể triển khai một giao diện TakesValue khác, bạn có thể lấy proxy chỉnh sửa trong phương thức setValue.

ValueAwareEditor cũng hoạt động, nhưng có tất cả những phương pháp bổ sung mà bạn không thực sự cần.