You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pa...@apache.org on 2012/01/13 08:24:19 UTC
[2/4] git commit: extra methods to generate JS callback functions for
AJAX calls
extra methods to generate JS callback functions for AJAX calls
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e62cd40b
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e62cd40b
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e62cd40b
Branch: refs/heads/master
Commit: e62cd40baa2e5818d924633bdf813325eb647d88
Parents: d640337
Author: Emond Papegaaij <pa...@apache.org>
Authored: Fri Jan 13 08:17:56 2012 +0100
Committer: Emond Papegaaij <pa...@apache.org>
Committed: Fri Jan 13 08:18:04 2012 +0100
----------------------------------------------------------------------
.../wicket/ajax/AbstractDefaultAjaxBehavior.java | 104 ++++++++++++--
1 files changed, 89 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/e62cd40b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
index 62921c5..46702a1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
@@ -16,6 +16,10 @@
*/
package org.apache.wicket.ajax;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map.Entry;
+
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.ajax.attributes.AjaxCallListener;
@@ -38,10 +42,6 @@ import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.resource.CoreLibrariesContributor;
import org.apache.wicket.util.string.Strings;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-
/**
* The base class for Wicket's default AJAX implementation.
*
@@ -70,7 +70,8 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
}
/**
- * @see org.apache.wicket.behavior.AbstractAjaxBehavior#renderHead(Component, org.apache.wicket.markup.head.IHeaderResponse)
+ * @see org.apache.wicket.behavior.AbstractAjaxBehavior#renderHead(Component,
+ * org.apache.wicket.markup.head.IHeaderResponse)
*/
@Override
public void renderHead(Component component, IHeaderResponse response)
@@ -82,7 +83,7 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
Url baseUrl = RequestCycle.get().getUrlRenderer().getBaseUrl();
CharSequence ajaxBaseUrl = Strings.escapeMarkup(baseUrl.toString());
response.render(JavaScriptHeaderItem.forScript("Wicket.Ajax.baseUrl=\"" + ajaxBaseUrl +
- "\";", "wicket-ajax-base-url"));
+ "\";", "wicket-ajax-base-url"));
renderExtraHeaderContributors(component, response);
}
@@ -90,27 +91,29 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
/**
* Renders header contribution by JavaScriptFunctionBody instances which additionally implement
* IComponentAwareHeaderContributor interface.
- *
+ *
* @param component
- * the component assigned to this behavior
+ * the component assigned to this behavior
* @param response
- * the current header response
+ * the current header response
*/
private void renderExtraHeaderContributors(Component component, IHeaderResponse response)
{
AjaxRequestAttributes attributes = getAttributes();
List<IAjaxCallListener> ajaxCallListeners = attributes.getAjaxCallListeners();
- for (IAjaxCallListener ajaxCallListener : ajaxCallListeners) {
+ for (IAjaxCallListener ajaxCallListener : ajaxCallListeners)
+ {
if (ajaxCallListener instanceof IComponentAwareHeaderContributor)
{
- IComponentAwareHeaderContributor contributor = (IComponentAwareHeaderContributor) ajaxCallListener;
+ IComponentAwareHeaderContributor contributor = (IComponentAwareHeaderContributor)ajaxCallListener;
contributor.renderHead(component, response);
}
}
List<JavaScriptPrecondition> preconditions = attributes.getPreconditions();
- for (JavaScriptPrecondition precondition : preconditions) {
+ for (JavaScriptPrecondition precondition : preconditions)
+ {
precondition.renderHead(component, response);
}
}
@@ -151,7 +154,10 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
attributes.getPreconditions().add(precondition);
}
- AjaxCallListener backwardCompatibleAjaxCallListener = new AjaxCallListener() {
+ AjaxCallListener backwardCompatibleAjaxCallListener = new AjaxCallListener()
+ {
+ private static final long serialVersionUID = 1L;
+
@Override
public CharSequence getSuccessHandler(Component component)
{
@@ -324,10 +330,12 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
}
String[] eventNames = attributes.getEventNames();
- if (eventNames.length == 1) {
+ if (eventNames.length == 1)
+ {
attributesJson.put("e", eventNames[0]);
}
- else {
+ else
+ {
for (String eventName : eventNames)
{
attributesJson.append("e", eventName);
@@ -403,6 +411,72 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
}
/**
+ * Generates a javascript function that can take parameters and performs an AJAX call which
+ * includes these parameters. The generated code looks like this:
+ *
+ * <pre>
+ * function(param1, param2) {
+ * var attrs = attrsJson;
+ * var params = {'param1': param1, 'param2': param2};
+ * attrs.ep = jQuery.extend(attrs.ep, params);
+ * Wicket.Ajax.ajax(attrs);
+ * }
+ * </pre>
+ *
+ * @param extraParameters
+ * @return A function that can be used as a callback function in javascript
+ */
+ protected CharSequence getCallbackFunction(String... extraParameters)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("function (");
+ boolean first = true;
+ for (String curExtraParameter : extraParameters)
+ {
+ if (!first)
+ sb.append(",");
+ sb.append(curExtraParameter);
+ }
+ sb.append(") {\n");
+ sb.append(getCallbackFunctionBody(extraParameters));
+ sb.append("}\n");
+ return sb;
+ }
+
+ /**
+ * Generates the body the {@linkplain #getCallbackFunction(String...) callback function}. To
+ * embed this code directly into a piece of javascript, make sure the extra parameters are
+ * available as local variables, global variables or within the closure.
+ *
+ * @param extraParameters
+ * @return The body of the {@linkplain #getCallbackFunction(String...) callback function}.
+ */
+ protected CharSequence getCallbackFunctionBody(String... extraParameters)
+ {
+ AjaxRequestAttributes attributes = getAttributes();
+ CharSequence attrsJson = renderAjaxAttributes(getComponent(), attributes);
+ StringBuilder sb = new StringBuilder();
+ sb.append("var attrs = ");
+ sb.append(attrsJson);
+ sb.append(";\n");
+ sb.append("var params = {");
+ boolean first = true;
+ for (String curExtraParameter : extraParameters)
+ {
+ if (!first)
+ sb.append(",");
+ sb.append("'").append(curExtraParameter).append("': ").append(curExtraParameter);
+ }
+ sb.append("};\n");
+ if (attributes.getExtraParameters().isEmpty())
+ sb.append("attrs.ep = params;\n");
+ else
+ sb.append("attrs.ep = jQuery.extend(attrs.ep, params);\n");
+ sb.append("Wicket.Ajax.ajax(attrs);\n");
+ return sb;
+ }
+
+ /**
* @return an optional javascript expression that determines whether the request will actually
* execute (in form of return XXX;);
* @deprecated Use {@link org.apache.wicket.ajax.attributes.AjaxRequestAttributes}