2017-02-21 94 views
0

我想從Wicket的Javascript中調用一些Java代碼。從Javascript撥打Wicket代碼

這是我的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方法

+0

你只是想要執行一些java/wicket代碼並從javascript中觸發它,或者你需要一個你從javascript調用中得到和處理的響應嗎?對於第一種情況,我會知道一個簡單的方法來實現這一點。 –

+0

是的,第一種情況對我有好處 – user2529173

回答

2

你是一個很好的方式。如果讓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和瀏覽器)。

1

一個簡單的方法這個網址觸發的Java /從Javascript代碼檢票口是用一個隱藏的輸入與事件的行爲掛鉤。

隱藏的輸入是「不可見」的表單元素,但對於這種情況可能非常有用。

設置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被某些記錄系統忽略。我也使用了變化事件,儘管其他人也可能會發揮作用。

相應的HTML的標記:

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

注:我給輸入值的固定ID。由於每個頁面上的ID都應該是唯一的,因此您無法將其放入Wicket Panel並將其多次添加到頁面中。您必須讓wicket創建ID(setOutputMarkupId(true)),然後找到一種方法將ID傳遞給您的JavaScript。但是對於這個非常簡單的例子,這應該就足夠了。

觸發的JavaScript

現在,所有你需要做的就是在你的隱藏輸入觸發更改事件,它會執行你在的onEvent方法定義的代碼。

與jQuery和ID,這是簡單的極端:

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

希望這個簡單的例子可以幫助你明白我的意思。正如我在我的評論中已經說過的那樣,當你的javascript調用不需要/關心響應時,這隻會非常有用,而你只是希望能夠從JavaScript中觸發wicket代碼。