考虑以下小部件。我将其中两个添加到我的页面中。第一个名称为“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() /*-{
$wnd.myWidget.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;
public void doSomething() {
Window.alert(name);
}
}
我现在的问题是:两个按钮都会提示消息“widget2”。那是因为我在“declareMethod”中覆盖了“myWidget”变量。我怎样才能调用doSomething() - 正确对象的方法?我可以在这里使用某种命名空间方法吗?
答案 0 :(得分:1)
您遇到的问题是,创建MyComponent
时,$wnd.myWidget
设置为引用该项目。因此,如果您创建MyComponent
#1,然后MyComponent
#2,则总是$wnd.myWidget
等于MyComponent
#2。
不是定义设置JS变量的方法,而是直接在本机方法中引用窗口,如下所示:
public native void myonclick(MyComponent comp) /*-{
comp.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;
然后,在点击处理程序中,按如下方式调用myonclick
:
@Override
public void onClick(ClickEvent event) {
myonclick(MyComponent.this);
}
我认为这应该有效。如果有任何问题,请告诉我,我会尽力帮助。
<强>更新强>: 您可以尝试以下方法,但老实说,我不知道它是否能与外部JavaScript一起使用。我从来没有真正完成这个用例。
public native void myonclick() /*-{
this.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;
答案 1 :(得分:0)
我现在通过沉没我感兴趣的事件来解决我的问题,例如构造函数中的sinkEvents(Event)并在我的onBrowserEvent(Event e)方法中处理它们。对于我的问题,这是一种更简单方便的方式。