2 Stimmen

Wicket 6.2 AbstractDefaultAjaxBehavior getCallbackUrl löst keine JS-Variablen mehr auf

Kürzlich habe ich daran gearbeitet, eine große Webanwendung zu aktualisieren, die Wicket 1.4.18 verwendet hat, auf 6.2. Wir hatten eine Situation, in der wir JavaScript-Variablen erstellen würden, um die Positionierung innerhalb einer Drag-and-Drop-Liste zu verfolgen. Dies ist nur der Wicket-Teil des Codes, da das JavaScript immer funktioniert hat und nicht geändert wurde.

ListItem.add(new AbstractDefaultAjaxBehavior()
{
    private static final long serialVersionUID = 1L;

    @Override
    public void onComponentTag(ComponentTag tag)
    {
        tag.put("ondrop", "var value = $(ui.item[0]).attr('hiddenvalue');"
            + this.getCallbackScript());
    }

    @Override
    public final CharSequence getCallbackUrl()
    {
        return super.getCallbackUrl() + "&hiddenvalue' + value + '";
    }
}

Das Problem, auf das ich jedoch stoße, ist, dass die JavaScript-Variablen nicht auf Werte aufgelöst werden und jetzt als reine Zeichenfolgen (z.B. 'value' anstelle von 5) im getCallbackUrl übernommen werden. Dies war bei Wicket 1.4.18 nicht der Fall, und ich glaube nicht, dass dieses Problem mit unserer Migration auf 1.5.8 entstanden ist.

Letztendlich möchten wir nur den Wert herausziehen können mit

@Override
protected void respond(AjaxRequestTarget target)
{
    getRequest().getRequestParameters().getParameterValue("hiddenvalue");
}

Irgendwelche Ratschläge dazu? Ich hoffe, ich habe genügend Informationen bereitgestellt. Vielen Dank im Voraus für jegliche Hilfe. Einiges davon übersteigt meine Kenntnisse und kann einschüchternd sein, wenn man nicht weiß, wo man suchen soll.

4voto

Thomas Punkte 2211

Wicket Ajax wurde für Wicket 6 vollständig neu geschrieben. Siehe diese Seite für eine detaillierte Beschreibung.

In Ihrem Fall sollten Sie die neuen AjaxRequestAttributes wie folgt verwenden:

@Override
protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) {
    super.updateAjaxAttributes(attributes);
    attributes.getExtraParameters().put("hiddenvalue", "value");
}

Die Abrufung des Werts aus der Anforderung funktioniert immer noch genauso wie zuvor.

@Override
protected void respond(AjaxRequestTarget target)
{
    getRequest().getRequestParameters().getParameterValue("hiddenvalue");
}

3voto

Gorky Punkte 1285

Ein weiterer sauberer Ansatz ist die Verwendung der Callback-Funktion

        AbstractDefaultAjaxBehavior ajaxBehavior = new AbstractDefaultAjaxBehavior() {

        @Override
        protected void respond(AjaxRequestTarget target) {
            String param1Value = getRequest().getRequestParameters().getParameterValue(AJAX_PARAM1_NAME).toString();
            String param2Value = getRequest().getRequestParameters().getParameterValue(AJAX_PARAM2_NAME).toString();
            System.out.println("Param 1:" + param1Value + " Param 2:" + param2Value);
        }

        @Override
        public void renderHead(Component component, IHeaderResponse response) {
            super.renderHead(component, response);
            String callBackScript = getCallbackFunction(CallbackParameter.explicit(AJAX_PARAM1_NAME), CallbackParameter.explicit(AJAX_PARAM2_NAME)).toString();
            callBackScript = "sendToServer="+callBackScript+";";
            response.render(OnDomReadyHeaderItem.forScript(callBackScript));
        }

    };
    add(ajaxBehavior);

Definieren Sie eine Variable für die Funktion in Ihrem JavaScript var sendToServer;

Sie wird beim Dom-Ready-Event von Wicket mit der Callback-Funktion initialisiert.

Rufen Sie sendToServer(x, y) aus JavaScript auf, um die Parameter an den Server zu übergeben.

1voto

Golyo Punkte 347
private static final String MY_PARAM = "myparam";
public static class SampleCallbackBehavior extends AbstractDefaultAjaxBehavior {        
    @Override
    public void renderHead(Component component, IHeaderResponse response) {
        super.renderHead(component, response);
        response.render(OnDomReadyHeaderItem.forScript("var myfunction : " + getCallbackFunction(CallbackParameter.explicit(MY_PARAM))));
    }
    @Override
    protected void respond(AjaxRequestTarget target) {
        StringValue paramValue = getComponent().getRequest().getRequestParameters().getParameterValue(MY_PARAM);
        //TODO handle callback
    }       
}

Danach sollten Sie die Funktion nur noch über JavaScript aufrufen

myfunction("paramValue");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X