【问题标题】:Wicket AbstractDefaultAjaxBehavior do recursive update the pageWicket AbstractDefaultAjaxBehavior 递归更新页面
【发布时间】:2016-06-09 07:22:57
【问题描述】:

我有一些 ajax 行为,应该使用 JS 选择一些数据,然后将其转回 Java。有时它可以工作,但通常只是添加 url 参数并进行页面刷新/

public abstract class LoggedVKIdBehaviour extends AbstractDefaultAjaxBehavior {
    private static final Logger logger = LoggerFactory.getLogger(LoggedVKIdBehaviour.class);
        @Override
        protected void respond(AjaxRequestTarget target) {
            String loggedVkId = RequestCycle.get().getRequest().getRequestParameters().getParameterValue("logged_vkid").toString();
            logger.info("ajax has comming with logged VK ID " + loggedVkId);
            recived(target, loggedVkId);
        }

        protected abstract void recived(AjaxRequestTarget target, String loggedVkId);

        @Override
        public void renderHead(final Component component, IHeaderResponse response) {
            super.renderHead(component, response);

            Map<String, Object> map = new HashMap<>();
            map.put("callbackFunction", getCallbackFunction(CallbackParameter.explicit("logged_vkid")));
//
            PackageTextTemplate ptt = new PackageTextTemplate(LoggedVKIdBehaviour.class, "vkid_callback.js");
            OnDomReadyHeaderItem onDomReadyHeaderItem = OnDomReadyHeaderItem.forScript(ptt.asString(map));
            response.render(onDomReadyHeaderItem);
        }
}

js 模板

var calback = ${callbackFunction};

var logged_vk_id = 11;

function authInfo(response) {
    if (response.session) {
        logged_vk_id = response.session.mid;
        calback(response.session.mid);
        console.log("recived callback from VK " + logged_vk_id);
    }
}
$(document).ready(function () {
        VK.Auth.getLoginStatus(authInfo);
});

它是像http://localhost:8080/mytool/product/1?logged_vkid=332797331&logged_vkid=332797331&logged_vkid=332797331&logged_vkid=332797331&logged_vkid=332773这样的递归重定向...

据我了解 Ajaj 技术 - 它是异步请求,根本不应该触及主 URL。那么页面刷新的原因是什么呢?

这是生成的回调函数

function (logged_vkid) {
var attrs =     {"u":"../wicket/bookmarkable/com.tac.kulik.pages.product.ProductPage?12-1.IBehaviorListener.0-&productID=1"};
var params = [{"name":"logged_vkid","value":logged_vkid}];
attrs.ep = params.concat(attrs.ep || []);
Wicket.Ajax.ajax(attrs);
}

我使用 wicket 7.2

【问题讨论】:

  • ${callbackFunction} 的生成替换是什么?
  • 我觉得不错。不知道那里出了什么问题。
  • 新闻很少。它来自父面板。在 recived(...) 方法的实现中,我一直在将父面板添加到目标。删除此行页面后不做循环刷新。但无论如何它都不能解决问题。在此页面上,我还有无状态表单,其标签带有 AjaxSelfUpdatingBehavior,持续时间为 5 秒。在这种情况下,我还刷新了整个页面,而不仅仅是一个标签
  • 如果你能在一个小的演示应用程序中重现这个,我很乐意看看!
  • 将尝试。但也可以共享整个项目。我很乐意给我任何反馈。关于源代码。万一我做的一切都在我的想象中。我擅长 Android,但至于 wicket-spring-ajax 就没有那么多了。可以在某个通话地点向您展示,以及重现的步骤。顺便准备演示项目))

标签: javascript ajax wicket


【解决方案1】:

这几天我做了很多调查。并发现当我删除时

setPageManagerProvider(new NoSerializationPageManagerProvider(this));

应用程序在礼貌日志中向我抛出 exepton

org.apache.wicket.WicketRuntimeException: A problem occurred while
trying to collect debug information about not serializable object look 
like it is could come from aused by: java.io.NotSerializableException:
 com.tac.kulik.panel.smaccounts.SMAccountsPanel$1

这意味着该页面出于某种原因尝试被序列化,但 $1 意味着匿名类。我几乎没有匿名创建类来管理来自 ListView 的一些 ajax 链接,以便在父面板上进行管理。所以在删除这个 Anonymous 类逻辑之后,一切都开始并运行良好。 所以我很高兴,但还是不明白是哪个原因页面在ajax 之后进行了序列化,以及刷新整个页面的原因是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多