GWT JSNI - вызов метода Java определенного объекта

Рассмотрим следующий виджет. Я добавляю два из них на свою страницу. Первый получает имя «widget1», второй — «widget2». Он просто должен выдавать свое имя, но вызывается из javascript. (Пример не имеет смысла, это просто простой пример, чтобы понять, как это можно сделать.)

public class MyComponent extends Composite{

    String name;
    public MyComponent(String name) {
        this.name =name;

        Button b = new Button(name);
        b.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                myonclick();

            }
        });
        initWidget(b);
        declareMethod(this);
    }

    public native void declareMethod(MyComponent myWidget) /*-{
            $wnd.myWidget = myWidget;

    }-*/;

    public native void myonclick() /*-{
        [email protected]::doSomething()();
    }-*/;

    public void doSomething() {
        Window.alert(name);
    }
}

Моя проблема сейчас такова: обе кнопки предупреждают о сообщении «widget2». Это потому, что я переопределяю переменную "myWidget" в "declareMethod". Как я могу заархивировать вызов метода doSomething() правильного объекта? Могу ли я использовать здесь какой-то подход к пространству имен?


person jan    schedule 13.06.2013    source источник


Ответы (2)


У вас есть проблема: когда создается MyComponent, $wnd.myWidget устанавливается для ссылки на этот элемент. Итак, если вы создадите MyComponent #1, затем MyComponent #2, у вас всегда будет $wnd.myWidget, равное MyComponent #2.

Вместо того, чтобы определять метод, который устанавливает переменную JS, обратитесь к окну непосредственно в собственном методе, как показано ниже:

public native void myonclick(MyComponent comp) /*-{
    [email protected]::doSomething()();
}-*/;

Затем в обработчике кликов вызовите myonclick следующим образом:

@Override
public void onClick(ClickEvent event) {
     myonclick(MyComponent.this);
}

Я думаю, это должно сработать. Дайте мне знать, если возникнут какие-либо проблемы, я постараюсь помочь.

обновление: вы можете попробовать следующее, но, честно говоря, я не знаю, будет ли это хорошо работать с внешним javascript. Мне никогда не приходилось работать с этим вариантом использования.

public native void myonclick() /*-{
    [email protected]::doSomething()();
}-*/;
person thy_stack_overfloweth    schedule 13.06.2013
comment
Также обратите внимание, что этот подход должен полностью исключить метод declareMethod. - person thy_stack_overfloweth; 14.06.2013
comment
На самом деле это не решает мою проблему. Это работает в данной ситуации. Но что, если я хочу вызвать метод из любого другого места (например, из внешнего javascript). Тогда у меня нет доступной переменной comp. - person jan; 14.06.2013

Сейчас я решал свою проблему, погружая интересующие меня события, например: sinEvents(Event) в конструкторе и обрабатывая их в моем методе onBrowserEvent(Event e). Это был гораздо более простой и удобный способ решения моей проблемы.

person jan    schedule 17.06.2013