对于一个新项目,我们正在使用一个复杂的外部 JavaScript 库,它需要一些参数进行初始化。此参数值仅在运行时才知道,因此我们希望为 JavaScript 构建某种 AJAX 机制,以便在需要时加载参数。
我试图通过以下机制来实现这一点:
PageThatContainsTheJavaScript.java
public GraphPanel(String id) {
add(new AbstractDefaultAjaxBehavior() {
protected void respond(final AjaxRequestTarget target) {
final RequestCycle requestCycle = RequestCycle.get();
TextRequestHandler textRequestHandler = new TextRequestHandler("text/plain", "UTF-8", content.toString()); //content - the parameter value
requestCycle.scheduleRequestHandlerAfterCurrent(textRequestHandler);
}
});
add(new Label("ajaxtest", ""));
}
@Override
protected void onBeforeRender() {
super.onBeforeRender();
String callbackUrl = behave.getCallbackUrl().toString();
String callbackFunction = String.format("Wicket.Ajax.get({'u':'%s'});",callbackUrl);
replace(new Label("ajaxtest", callbackFunction));
}
标签“ajaxtest”只是为了测试目的方便地访问生成的回调 url 的一种方式。
PageThatContainsTheJavaScript.html
function externalApplicationStart() {
var parameter = Wicket.Ajax.get({'u':"'"+document.getElementById('ajaxtest').innerHTML+"'"});
var application = new demo.yfiles.layout.modules.LayoutModulesDemo(parameter);
// arbitrary init code
application.start();
});
我没有找到关于这个问题的真正好的教程,所以这个尝试可能有问题,尽管我猜总体方向是正确的。
我的问题是,只要存在 Wicket.ajax.get 行,JavaScript 函数就会挂起。当我注释该行并传递一个硬编码的默认参数时,应用程序就会启动。我做错了什么,如何将字符串参数从 Wicket 获取到 JavaScript 函数?
我发现的一个功能性解决方案是将参数值作为隐藏 HTML 标记的内容(如<span id='...' style='display:none;'>parameterValue</span>
)传递,但将来可能需要将更长的值传递给 JavaScript(如 XML 内容),我不想搞砸生成的 HTML 包含所有这些非内容值。
//edit: 生成的 ajaxtest-HTML-Tag 如下所示:
<span wicket:id="ajaxtest" id="ajaxtest">
Wicket.Ajax.get({'u':'./.?0-1.IBehaviorListener.0-graphContainer-graphControl'});
</span>
尝试Wicket.Ajax.get({'u':'./.?0-1.IBehaviorListener.0-graphContainer-graphControl'});
在控制台中执行只会导致undefined
.
此外,我不确定 URL 中的第二个点来自哪里(./.?0
...),但尝试使用./?0
... 结果相同。