为什么我的活动会丢失?/奇怪的JavaScript异常
我试图将事件从儿童演示者发送到母亲演示者。首先,我认为这些事件很快就会消失。我用try/catch块包围了fireEvent调用,并出现以下错误: -:-2014-11-06 10:13:26069[错误]捕获到异常: com.google.gwt.core.client.JavaScriptException:类型错误 __gwt$exception::无法读取未定义的属性“b” 在未知位置。f2bmdm-0。js@180:2440 在未知的0.k2bmdm-0。js@182:2442 在未知的0.t2bmdm-0。js@51:2448 我最初的问题太长了,所有的编辑可能让大多数人感到困惑。因此,我构建了一个完全精简的示例,其中仍然存在错误。这将使跟踪错误变得更容易。我希望通过这种方式我可以自己解决它,但我不能。 我现在也包括了导入内容,只是为了确保不会遗漏任何细节。 我有一个母亲演讲者,我也把它拆了下来,现在几乎什么都不做:为什么我的活动会丢失?/奇怪的JavaScript异常,java,gwt,gwtp,Java,Gwt,Gwtp,我试图将事件从儿童演示者发送到母亲演示者。首先,我认为这些事件很快就会消失。我用try/catch块包围了fireEvent调用,并出现以下错误: -:-2014-11-06 10:13:26069[错误]捕获到异常: com.google.gwt.core.client.JavaScriptException:类型错误 __gwt$exception::无法读取未定义的属性“b” 在未知位置。f2bmdm-0。js@180:2440 在未知的0.k2bmdm-0。js@182:2442 在未知
package testproject.client.application.policies;
import testproject.client.application.ApplicationPresenter;
import testproject.client.application.policies.test.TestPolicyPresenterWidget;
import testproject.client.events.TestPolicyEvent;
import testproject.client.events.TestPolicyEvent.TestPolicyEventHandler;
import testproject.client.place.NameTokens;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.Presenter;
import com.gwtplatform.mvp.client.View;
import com.gwtplatform.mvp.client.annotations.NameToken;
import com.gwtplatform.mvp.client.annotations.ProxyEvent;
import com.gwtplatform.mvp.client.annotations.ProxyStandard;
import com.gwtplatform.mvp.client.proxy.ProxyPlace;
public class PolicyPresenter extends
Presenter<PolicyPresenter.MyView, PolicyPresenter.MyProxy> implements TestPolicyEventHandler {
private TestPolicyPresenterWidget testPolicyDialog;
@ProxyStandard
@NameToken(NameTokens.policiesPage)
public interface MyProxy extends ProxyPlace<PolicyPresenter> {
}
public interface MyView extends View {
HasClickHandlers getTestPolicyButton();
}
@Inject
PolicyPresenter(EventBus eventBus, MyView view, MyProxy proxy,
TestPolicyPresenterWidget testPolicyDialog) {
super(eventBus, view, proxy, ApplicationPresenter.SLOT_SetMainContent);
this.testPolicyDialog = testPolicyDialog;
}
@Override
protected void onBind() {
super.onBind();
addRegisteredHandler(TestPolicyEvent.TYPE, this);
// Handler for add Policy Button
getView().getTestPolicyButton().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
Log.debug("Test Policy received click event");
addToPopupSlot(testPolicyDialog);
}
});
}
@Override
protected void onReveal() {
super.onReveal();
}
@Override
protected void onReset() {
super.onReset();
}
@ProxyEvent
@Override
public void onTestPolicyEvent(TestPolicyEvent event) {
Log.debug("TestPolicyCreatedEvent caught");
}
}
视图:
package testproject.client.application.policies.test;
import testproject.client.model.ContainerPolicy;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.PopupViewWithUiHandlers;
public class TestPolicyView extends PopupViewWithUiHandlers<TestPolicyUiHandlers> implements
TestPolicyPresenterWidget.MyView, Editor<ContainerPolicy> {
interface Binder extends UiBinder<PopupPanel, TestPolicyView> {
}
public interface Driver extends SimpleBeanEditorDriver<ContainerPolicy, TestPolicyView> {
}
@UiField
CheckBox enabled;
@UiField
CheckBox enforced;
@UiField
TextBox policyType;
@UiField
TextBox containerGroup;
@UiField
Button okButton;
@UiField
Button cancelButton;
@Inject
TestPolicyView(Binder uiBinder,EventBus eventBus) {
super(eventBus);
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("okButton")
void okButtonClicked(ClickEvent event) {
getUiHandlers().createPolicy();
hide();
}
@UiHandler("cancelButton")
void cancelButtonClicked(ClickEvent event) {
hide();
}
@Override
public CheckBox getEnabled() {
return enabled;
}
@Override
public CheckBox getEnforced() {
return enforced;
}
@Override
public TextBox getPolicyType() {
return policyType;
}
@Override
public TextBox getContainerGroup() {
return containerGroup;
}
}
当我试图访问createPolicy方法中的任何对象时,就会发生上面提到的错误。例如,当我称之为:
Log.debug("Click event on ok Button in add policy dialog caught. ");
Log.debug("Firing Event");
eventBus.fireEvent(new TestPolicyEvent());
我得到了错误。无论我使用eventBus.fireEvent还是fireEvent。当我尝试访问其他对象时也会发生这种情况。所以我想问题其实与事件处理无关。但这是什么原因呢
感谢您迄今为止的帮助和阅读本…您确定您添加的try/catch正在记录您的异常吗?使用ViewWithUiHandlers时,需要手动设置视图的UiHandlers。在TestPolicyPresenterWidget中,您需要在其构造函数中添加view.setUiHandlersthis,否则getUiHandlers将在您的视图中返回null。!您确定要在视图和演示者中插入相同的eventBus实例吗?我可能错了。你在这里用杜松子酒吗?如果是,你确定事件总线是相同的吗?我看不到您的注入绑定,所以可能是不同的实例?对,检查您的导入EventBus应该是com.google.web.bindery.event.shared.EventBus,而不是com.google.gwt.event.shared.EventBus它是com.google.web.bindery.event.shared.EventBus。@Terry:正确。它们不应该通过注入DevicePresenter来初始化吗?哇,谢谢。这真的解决了问题。我双目失明,看不出我错过了那一刻。因此,失踪事件掩盖了根本问题。谢谢大家帮助我!
package testproject.client.application.policies.test;
import testproject.client.model.ContainerPolicy;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.PopupViewWithUiHandlers;
public class TestPolicyView extends PopupViewWithUiHandlers<TestPolicyUiHandlers> implements
TestPolicyPresenterWidget.MyView, Editor<ContainerPolicy> {
interface Binder extends UiBinder<PopupPanel, TestPolicyView> {
}
public interface Driver extends SimpleBeanEditorDriver<ContainerPolicy, TestPolicyView> {
}
@UiField
CheckBox enabled;
@UiField
CheckBox enforced;
@UiField
TextBox policyType;
@UiField
TextBox containerGroup;
@UiField
Button okButton;
@UiField
Button cancelButton;
@Inject
TestPolicyView(Binder uiBinder,EventBus eventBus) {
super(eventBus);
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("okButton")
void okButtonClicked(ClickEvent event) {
getUiHandlers().createPolicy();
hide();
}
@UiHandler("cancelButton")
void cancelButtonClicked(ClickEvent event) {
hide();
}
@Override
public CheckBox getEnabled() {
return enabled;
}
@Override
public CheckBox getEnforced() {
return enforced;
}
@Override
public TextBox getPolicyType() {
return policyType;
}
@Override
public TextBox getContainerGroup() {
return containerGroup;
}
}
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:DialogBox modal="false">
<g:caption>
<b>Policy</b>
</g:caption>
<g:HTMLPanel>
<div class="locked">
<div class="lockedpanel float-wrapper container-edit">
<!-- Device block -->
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">Policy</h4>
</div>
<div class="panel-body">
<form class="form-bordered">
<div class="form-group">
<label class="col-sm-4 control-label">Enabled</label>
<div class="col-sm-8">
<g:CheckBox ui:field="enabled" styleName="form-control input-sm"/>
</div>
<label class="col-sm-4 control-label">Enforced</label>
<div class="col-sm-8">
<g:CheckBox ui:field="enforced" styleName="form-control input-sm" />
</div>
<label class="col-sm-4 control-label">Policy Type</label>
<div class="col-sm-8">
<g:TextBox ui:field="policyType" styleName="form-control input-sm"/>
</div>
<label class="col-sm-4 control-label">Container Group</label>
<div class="col-sm-8">
<g:TextBox ui:field="containerGroup" styleName="form-control input-sm"/>
</div>
</div><!-- form-group -->
</form>
</div><!-- panel-body -->
</div><!-- panel-default -->
<div class="float-right">
<g:Button ui:field="okButton" styleName="btn btn-primary btn-bordered">Ok</g:Button>
<g:Button ui:field="cancelButton" styleName="btn btn-primary btn-bordered">Cancel</g:Button>
</div>
</div><!-- lockedpanel -->
</div>
</g:HTMLPanel>
</g:DialogBox>
</ui:UiBinder>
package testproject.client.application;
...
public class ApplicationModule extends AbstractPresenterModule {
@Override
protected void configure() {
install(new UiModule());
// Application Presenters
bindPresenter(ApplicationPresenter.class, ApplicationPresenter.MyView.class, ApplicationView.class,
ApplicationPresenter.MyProxy.class);
...
bindPresenter(PolicyPresenter.class, PolicyPresenter.MyView.class, PolicyView.class, PolicyPresenter.MyProxy.class);
bindSingletonPresenterWidget(TestPolicyPresenterWidget.class, TestPolicyPresenterWidget.MyView.class,
TestPolicyView.class);}
}
Log.debug("Click event on ok Button in add policy dialog caught. ");
Log.debug("Firing Event");
eventBus.fireEvent(new TestPolicyEvent());