为什么我的活动会丢失?/奇怪的JavaScript异常

为什么我的活动会丢失?/奇怪的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 在未知

我试图将事件从儿童演示者发送到母亲演示者。首先,我认为这些事件很快就会消失。我用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

我最初的问题太长了,所有的编辑可能让大多数人感到困惑。因此,我构建了一个完全精简的示例,其中仍然存在错误。这将使跟踪错误变得更容易。我希望通过这种方式我可以自己解决它,但我不能。 我现在也包括了导入内容,只是为了确保不会遗漏任何细节。 我有一个母亲演讲者,我也把它拆了下来,现在几乎什么都不做:

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());