我在一个页面上有一个检票口应用程序,对于同一模型,我们有多种形式,分为不同的选项卡。我需要做的是每当单击选项卡时检查js变量tabDirty设置为true还是false。如果是true,如果可以,我将启动confirm提示符,然后重置该表单并移至单击的选项卡。如果取消,请保留该标签并保持当前更改。

我有这个js警告没有幻想

function warnOnChange(){
    if(tabDirty){
        decision = confirm('Leave?');
        if(decision){
            resetTab(); //sets tabDirty back to false
        } else {
            return false;
        }
    }
}


我有一个超级简单的检票口行为

public class WarnChangePromptOnClickBehavior extends Behavior {

    @Override
    public void bind(Component component) {
        component.add(JQBehaviors.mouseClick(EditMerchant.WARN_ON_CHANGE));
    }
}


并将该行为添加到AjaxFallBackLink

AjaxTabbedPanel<CustomAjaxTab> tabbedPanel = new AjaxTabbedPanel<CustomAjaxTab>("tabbedPanel", tabList, new Model<>(0)) {

    private static final long serialVersionUID = 1L;

    @Override
    protected WebMarkupContainer newLink(final String linkId, final int index) {
        AjaxFallbackLink<Void> link = new AjaxFallbackLink<Void>(linkId) {

            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(final AjaxRequestTarget target) {
                TabbedPanel<CustomAjaxTab> selectedTab = setSelectedTab(index);
                CustomAjaxTab tab = tabList.get(index);
                if (target != null) {

                    tab.getPanel(linkId);

                    target.add(selectedTab);
                }
                onAjaxUpdate(target);
            }
        };

        link.add(new WarnChangePromptOnClickBehavior());
        return link;
    }

};


当前的行为是,如果没有更改,则选项卡不会切换提示。如果有更改,则提示我。如果可以,则重置tabDirty并转到下一页清除更改。问题是,如果单击“取消”,我仍然会导航到下一个选项卡并丢失更改。我知道我需要更改onClick中的某些内容,但这只是不向我注册。

最佳答案

拦截JS事件循环并不容易,尤其是在使用Ajax请求时。

这是一种可行的方法:


warnOnChange()中,如果dirty,则调用event.preventDefault()event.stopImmediatePropagation()。这将告诉浏览器不要遵循链接/进行Ajax调用。然后像现在一样显示确认对话框。
如果用户按下Cancel,则无事可做
如果使用确认,则将dirty设置为false并执行jQuery(event.target).triggerHandler(event.type),即在链接上执行相同的事件(click)。这次它不会变脏,它将继续进行Ajax调用。

关于java - 将行为添加到Wicket选项卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52880552/

10-16 12:46