【问题标题】:Call Wicket Code from Javascript从 Javascript 调用 Wicket 代码
【发布时间】:2017-02-21 19:58:40
【问题描述】:

我正在尝试从 Wicket 中的 Javascript 调用一些 Java 代码。

这是我的 Java 代码:

public ShowUnternehmen() {

    add(new AbstractDefaultAjaxBehavior() {
        @Override
        protected void respond(AjaxRequestTarget ajaxRequestTarget) {
            System.out.println("respond");
        }

        @Override
        public void renderHead(Component component, IHeaderResponse response) {
            super.renderHead( component, response );
            System.out.println(getCallbackUrl());
        }
    });

}

这是 Javascript 代码:

<wicket:head>
    <script type="text/javascript" >
        $(function() {
            $.contextMenu({
                selector: '.context-menu-one',
                callback: function(key, options) {
                    var m = "clicked: " + key;
                    alert("BLA");
                    Wicket.Ajax.get({"u":"./com.emg.panels.unternehmen.ShowUnternehmen?1-1.IBehaviorListener.0-"})
                },
                items: {
                    "edit": {name: "Editieren", icon: "edit"},
                    "quit": {name: "Abbrechen", icon: function(){
                        return 'context-menu-icon context-menu-icon-quit';
                    }}
                }
            });

            $('.context-menu-one').on('click', function(e){
                console.log('clicked', this);
            })
        });
    </script>
</wicket:head>

但是响应方法永远不会执行。我正在查看其他示例,但它们似乎都令人困惑。

我从 renderHead 方法得到这个 url

【问题讨论】:

  • 您只是希望能够执行一些 java/wicket 代码并从 javascript 触发它,还是您需要从 javascript 调用中获取和处理的响应?对于第一种情况,我会知道一种简单的存档方法。
  • 是的,第一个案例对我有好处
  • @OH GOD SPIDERS 我可以使用帮助来返回数据。我对此提出了一个新问题:stackoverflow.com/questions/49789018/…

标签: javascript java wicket


【解决方案1】:

你走的很好。如果让 wicket 将回调函数渲染到页面会更可靠。以下两个示例展示了如何做到这一点:

A) 渲染一个全局回调函数。缺点是您将只有一个回调端点。

(1) 创建如下行为:

public class CallFromJavascriptBehavior extends AbstractDefaultAjaxBehavior {
@Override
protected void respond(AjaxRequestTarget target) {
    final StringValue parameterValue = RequestCycle.get().getRequest().getQueryParameters().getParameterValue("yourName");
    System.out.println(String.format("Hello %s", parameterValue.toString()));
}

@Override
public void renderHead(Component component, IHeaderResponse response) {
    super.renderHead(component, response);
    response.render(JavaScriptHeaderItem.forScript(String.format("nameOfFunction=%s", getCallbackFunction(CallbackParameter.explicit("yourName"))), "CallFromJavascriptBehavior"));
}}

(2) 将此行为添加到您的检票口页面。

(3) 现在你可以调用 nameOfFunction('Markus');来自您的 javascript。

B) 为页面上的每个组件实例调用一个初始化函数。

(1) 给你的页面添加一个初始化函数

<script>
    function initMyComponent(selector, callback){
        $(selector).click(function(){
            callback("Markus");
        });
    }
</script>

(2) 创建如下行为,调用初始化函数并传递必要的选择器和回调函数。

public class ComponentBehavior extends AbstractDefaultAjaxBehavior{
@Override
protected void respond(AjaxRequestTarget target) {
    final StringValue parameterValue = RequestCycle.get().getRequest().getQueryParameters().getParameterValue("yourName");
    System.out.println(String.format("Hello %s", parameterValue.toString()));
}

@Override
public void renderHead(Component component, IHeaderResponse response) {
    super.renderHead(component, response);
    response.render(OnDomReadyHeaderItem.forScript(String.format("initMyComponent('#%s', %s)", component.getMarkupId(), getCallbackFunction(CallbackParameter.explicit("yourName")))));
}}

(3) 将行为添加到您的检票口组件。

如果响应方法没有被调用,这可能有不同的原因。您应该首先检查您的控制台(ide 和浏览器)。

【讨论】:

  • 如果没有任何反应并且控制台没有显示错误消息,请确保页面上仍然存在添加行为的组件。呈现的 JavaScript 保留在页面上,因此您仍然可以调用它,但 Wicket 什么也不做。修复该选项后,A 对我有用...
【解决方案2】:

从 Javascript 触发 java/wicket 代码的一种简单方法是使用带有事件行为的隐藏输入作为挂钩。

隐藏输入是“不可见”的表单元素,但在这种情况下非常有用。

设置 Wicket 组件

首先我们在我们的 Wicket 页面上添加一个 HiddenField 并给它一个 AjaxEventBehavior

final HiddenField<Void> hiddenInput = new HiddenField<>("hiddenInput");
add(hiddenInput);
hiddenInput.add(new AjaxEventBehavior("change") {

    @Override
    protected void onEvent(final AjaxRequestTarget target) {
        // Execute any code you like and respond with an ajax response 
        target.appendJavaScript("alert('Hidden Input Change Event Behaviour!');");
        }
});

我使用该 Javascript 警报作为示例,因为 System.out.println 可能会被某些记录器系统忽略。我也使用了 change 事件,尽管其他事件可能也可以。

相应的 HTML 标记:

<input type="hidden" wicket:id="hiddenInput" id="hiddenInput1"/>

注意:我给输入一个固定的 id 值。由于 id 在每个页面上都应该是唯一的,因此您无法将其放入 Wicket 面板并将其多次添加到页面中。您必须让 wicket 创建 id (setOutputMarkupId(true)),然后找到将 id 传递给您的 javascript 的方法。但是对于这个非常简单的示例,这应该足够了。

使用 Javascript 触发

现在您需要做的就是在隐藏的输入上触发一个更改事件,它将执行您在 onEvent 方法中定义的代码。

使用 JQuery 和 id,这非常简单:

<script>
    $('#hiddenInput1').change();
</script>

希望这个简单的例子可以帮助你理解这个想法。正如我在我的 cmets 中已经说过的,这仅在您的 javascript 调用不需要/关心响应并且您只想能够从 JavaScript 触发检票口代码时才真正有用。

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多